This is the mail archive of the cygwin-developers@sources.redhat.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Clipboard from Cygwin (read-only)


This patch against current CVS sources adds read-only access to the
windows clipboard by creating a /dev/clipboard device. The uuencoded
tar.gz file contains a patch, clipboard.patch2, and a new file,
winsup/cygwin/fhandler_clipboard.cc.  Both the patch and the new file
are pasted in plaintext below the .tar.gz.uue.

2000-08-11  Charles Wilson  cwilson@ece.gatech.edu

	* winsup/cygwin/Makefile.in: add fhandler_clipboard.o
	to build list
	* winsup/cygwin/fhandler.h fhandler_dev_clipboard:
	new class definition
	* winsup/cygwin/fhandler.h: add FH_CLIPBOARD to 
	device enum
	* winsup/cygwin/hinfo.cc build_fhandler: add case
	for FH_CLIPBOARD
	* winsup/cygwin/path.cc: add \dev\clipboard to
	windows_device_names[]
	* winsup/cygwin/path.cc get_device_number: add
	case for clipboard to deveq
	* winsup/cygwin/winsup.h: add definitions for
	CF_TEXT, OpenClipboard, GetClipboard, and
	CloseClipboard.
	* winsup/cygwin/fhandler_clipboard.cc: new file

--Chuck

begin 644 clipboard-patch2.tar.gz
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
<(N)_=;9[&2_C9;R,E_$R7@:-_P`7(2DX`"@``(<1
`
end

--------------------- clipboard.patch2 ------------------------
? fhandler_clipboard.cc
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/Makefile.in,v
retrieving revision 1.26
diff -u -r1.26 Makefile.in
--- Makefile.in	2000/08/02 16:28:17	1.26
+++ Makefile.in	2000/08/11 21:54:49
@@ -114,18 +114,19 @@
 
 EXTRA_OFILES=$(bupdir1)/libiberty/random.o
$(bupdir1)/libiberty/strsignal.o
 
-DLL_IMPORTS:=$(w32api_lib)/libkernel32.a
+DLL_IMPORTS:=$(w32api_lib)/libkernel32.a $(w32api_lib)/libuser32.a
 
 DLL_OFILES:=assert.o dcrt0.o debug.o delqueue.o dir.o dlfcn.o
dll_init.o \
 	environ.o  errno.o exceptions.o exec.o external.o fcntl.o fhandler.o \
 	fhandler_console.o fhandler_floppy.o fhandler_random.o fhandler_raw.o
\
 	fhandler_serial.o fhandler_tape.o fhandler_termios.o fhandler_tty.o \
-	fhandler_windows.o fhandler_zero.o fork.o glob.o grp.o heap.o hinfo.o
\
-	init.o ioctl.o localtime.o malloc.o mmap.o net.o ntea.o passwd.o \
-	path.o pinfo.o pipe.o poll.o regexp.o regerror.o regsub.o registry.o \
-	resource.o scandir.o security.o select.o shared.o signal.o sigproc.o \
-	smallprint.o spawn.o strace.o strsep.o sync.o syscalls.o sysconf.o \
-	syslog.o termios.o times.o tty.o uinfo.o uname.o wait.o window.o \
+	fhandler_windows.o fhandler_zero.o fhandler_clipboard.o fork.o glob.o
\
+	grp.o heap.o hinfo.o init.o ioctl.o localtime.o malloc.o mmap.o net.o
\
+	ntea.o passwd.o path.o pinfo.o pipe.o poll.o regexp.o regerror.o \
+	regsub.o registry.o resource.o scandir.o security.o select.o shared.o
\
+	signal.o sigproc.o smallprint.o spawn.o strace.o strsep.o sync.o \
+	syscalls.o sysconf.o syslog.o termios.o times.o tty.o uinfo.o uname.o
\
+	wait.o window.o \
 	$(EXTRA_DLL_OFILES) $(EXTRA_OFILES) $(MT_SAFE_OBJECTS)
 
 GMON_OFILES:= gmon.o mcount.o profil.o
@@ -307,6 +308,7 @@
 fhandler_floppy.o: $(WINSUP_H)
 fhandler_tape.o: $(WINSUP_H)
 fhandler_zero.o: $(WINSUP_H)
+fhandler_clipboard.o: $(WINSUP_H)
 fhandler_random.o: $(WINSUP_H)
 fork.o: $(WINSUP_H) dll_init.h
 glob.o: include/glob.h
Index: fhandler.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler.h,v
retrieving revision 1.16
diff -u -r1.16 fhandler.h
--- fhandler.h	2000/07/29 04:19:24	1.16
+++ fhandler.h	2000/08/11 21:54:52
@@ -27,6 +27,7 @@
      fhandler_dev_raw     (fhandler_raw.cc)
      fhandler_dev_floppy  (fhandler_floppy.cc)
      fhandler_dev_tape    (fhandler_tape.cc)
+     fhandler_dev_clipboard	(fhandler_clip.cc)
 
      fhandler_pipe
      fhandler_socket      (net.cc)
@@ -94,8 +95,9 @@
   FH_NULL    = 0x00000013,	/* is the null device */
   FH_ZERO    = 0x00000014,	/* is the zero device */
   FH_RANDOM  = 0x00000015,	/* is a random device */
+  FH_CLIPBOARD = 0x00000016,  /* is the windows clipboard */
 
-  FH_NDEV    = 0x00000016,	/* Maximum number of devices */
+  FH_NDEV    = 0x00000017,	/* Maximum number of devices */
   FH_DEVMASK = 0x00000fff,	/* devices live here */
   FH_BAD     = 0xffffffff
 };
@@ -761,6 +763,21 @@
   int dup (fhandler_base *child);
 
   void dump ();
+};
+
+class fhandler_dev_clipboard: public fhandler_base
+{
+public:
+  fhandler_dev_clipboard (const char *name);
+
+  void dump ();
+
+  int is_windows (void) { return 1; }
+  int open (const char *path, int flags, mode_t mode = 0);
+  int write (const void *ptr, size_t len);
+  int read (void *ptr, size_t len);
+  off_t lseek (off_t, int);
+  int close (void);
 };
 
 class fhandler_windows: public fhandler_base
Index: hinfo.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/hinfo.cc,v
retrieving revision 1.13
diff -u -r1.13 hinfo.cc
--- hinfo.cc	2000/08/04 04:04:46	1.13
+++ hinfo.cc	2000/08/11 21:54:53
@@ -283,6 +283,9 @@
       case FH_ZERO:
 	fh = new (buf) fhandler_dev_zero (name);
 	break;
+      case FH_CLIPBOARD:
+	fh = new (buf) fhandler_dev_clipboard (name);
+	break;
       case FH_RANDOM:
 	fh = new (buf) fhandler_dev_random (name, unit);
 	break;
Index: path.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/path.cc,v
retrieving revision 1.41
diff -u -r1.41 path.cc
--- path.cc	2000/08/02 16:28:17	1.41
+++ path.cc	2000/08/11 21:54:58
@@ -437,6 +437,7 @@
   "\\dev\\st%d",
   "nul",
   "\\dev\\zero",
+  "\\dev\\clipboard",
   "\\dev\\%srandom",
 };
 
@@ -502,6 +503,8 @@
 	devn = FH_NULL;
       else if (deveq ("zero"))
 	devn = FH_ZERO;
+      else if (deveq ("clipboard"))
+	devn = FH_CLIPBOARD;
       else if (deveq ("random") || deveq ("urandom"))
         {
 	  devn = FH_RANDOM;
Index: winsup.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/winsup.h,v
retrieving revision 1.27
diff -u -r1.27 winsup.h
--- winsup.h	2000/08/10 19:33:54	1.27
+++ winsup.h	2000/08/11 21:55:02
@@ -72,8 +72,12 @@
 #undef _WINNETWK_H
 #undef _WINSVC_H
 
-/* The one function we use from winuser.h most of the time */
+/* The few functions we use from winuser.h most of the time */
 extern "C" DWORD WINAPI GetLastError (void);
+#define CF_TEXT 1
+extern "C" BOOL WINAPI OpenClipboard(HWND);
+extern "C" HANDLE WINAPI GetClipboardData(UINT);
+extern "C" BOOL WINAPI CloseClipboard(void);
 
 /* Used for runtime OS check/decisions. */
 enum os_type {winNT = 1, win95, win98, win32s, unknown};
------------------ end clipboard.patch2 ------------------------


----------------- winsup/cygwin/fhandler_clipboard.cc ----------
/* fhandler_dev_clipboard: code to access /dev/clipboard

   Copyright 2000 Red Hat

   Written by Charles Wilson (cwilson@ece.gatech.edu)

This file is part of Cygwin.

This software is a copyrighted work licensed under the terms of the
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
details. */

#include <errno.h>
#include "winsup.h"
#include <windows.h>

static BOOL clipboard_eof; // NOT THREAD-SAFE

fhandler_dev_clipboard::fhandler_dev_clipboard (const char *name)
  : fhandler_base (FH_CLIPBOARD, name)
{
  set_cb (sizeof *this);
  clipboard_eof = false;
}

int
fhandler_dev_clipboard::open (const char *, int flags, mode_t)
{
  set_flags (flags);
  clipboard_eof = false;
  return 1;
}

int
fhandler_dev_clipboard::write (const void *, size_t len)
{
  return len;
}

int
fhandler_dev_clipboard::read (void *ptr, size_t len)
{
  HGLOBAL hglb;
  LPSTR lpstr;
  int ret;
 
  if (!clipboard_eof)
    {
      OpenClipboard(0);
      hglb = GetClipboardData(CF_TEXT);
      lpstr = (LPSTR) GlobalLock(hglb);
      if (len < sizeof (lpstr))
        {
          set_errno (EINVAL);
          GlobalUnlock (hglb);
          CloseClipboard ();
          return -1;
        }

      ret = snprintf((char *) ptr, len, "%s", lpstr);
      GlobalUnlock(hglb);
      CloseClipboard();
      set_errno (0);
      clipboard_eof = true;
      return ret;
    }
  else
    {
      return 0;
    }
}

off_t
fhandler_dev_clipboard::lseek (off_t, int)
{
  return 0;
}

int
fhandler_dev_clipboard::close (void)
{
  clipboard_eof = false;
  return 0;
}

void
fhandler_dev_clipboard::dump ()
{
  paranoid_printf("here, fhandler_dev_clipboard");
}
------------- end winsup/cygwin/fhandler_clipboard.cc ----------

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]