This is the mail archive of the cygwin@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]

Re: Clipboard from Cygwin?


DJ Delorie wrote:
> 
> > Or better yet, how about implementing a /dev/clipboard like uwin has?
> 
> cygwin includes a tutorial on adding device handlers to cygwin1.dll.
> Why not give it a try?  I'd hate to think I'd wasted all that effort
> writing a tutorial that nobody uses...
> 
> http://sources.redhat.com/cygwin/snapshots/winsup-src-20000725.tar.bz2/winsup/doc/fhandler-tut.txt

Cool. Here's a first attempt -- but I can't get it to build. (Errors
building cygwin, but apparently because I don't know how -- I'm not
getting errors in the code affected by this patch, but elsewhere:
missing stdarg.h & stddef.h files...). 

Anyway, below there's a patch (that affects pre-existing files in CVS)
and a new file: fhandler_clipboard.cc. It should do read-only clipboard
access right now. gzip+uuencode versions pasted below.

--Chuck


----------------------snip-----------------------------
/* fhandler_dev_handler.cc: code to access /dev/zero

   Copyright 2000 Cygnus Solutions.

   Written by DJ Delorie (dj@cygnus.com)

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>

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

int
fhandler_dev_clipboard::open (const char *, int flags, mode_t)
{
  set_flags (flags);
  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;

  OpenClipboard(0);
  hglb = GetClipboardData(CF_TEXT);
  lpstr = (LPSTR) GlobalLock(hglb);

  len = snprintf((char *) ptr, len, "%s", lpstr);
  GlobalUnlock(hglb);
  CloseClipboard();
  return len;
}

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

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

void
fhandler_dev_clipboard::dump ()
{
  paranoid_printf("here, fhandler_dev_clipboard");
}
-------------------------snip-----------------------

---------------------clip.patch--------------------------
Index: winsup/cygwin/Makefile.in
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/Makefile.in,v
retrieving revision 1.25
diff -u -r1.25 Makefile.in
--- Makefile.in 2000/07/10 15:30:04     1.25
+++ Makefile.in 2000/08/02 01:18:22
@@ -122,12 +122,13 @@
        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
@@ -309,6 +310,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: winsup/cygwin/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/02 01:18:23
@@ -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,29 @@
   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);
+  int ioctl (unsigned int cmd, void *);
+  off_t lseek (off_t, int);
+  int close (void);
+
+  void set_close_on_exec (int val);
+  void fixup_after_fork (HANDLE parent);
+  select_record *select_read (select_record *s);
+  select_record *select_write (select_record *s);
+  select_record *select_except (select_record *s);
+  int ready_for_read (int fd, DWORD howlong, int ignra);
 };
 
 class fhandler_windows: public fhandler_base
Index: winsup/cygwin/hinfo.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/hinfo.cc,v
retrieving revision 1.11
diff -u -r1.11 hinfo.cc
--- hinfo.cc    2000/07/29 16:01:23     1.11
+++ hinfo.cc    2000/08/02 01:18:24
@@ -282,6 +282,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: winsup/cygwin/path.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/path.cc,v
retrieving revision 1.40
diff -u -r1.40 path.cc
--- path.cc     2000/07/29 17:36:05     1.40
+++ path.cc     2000/08/02 01:18:27
@@ -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/cygwin/winsup.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/winsup.h,v
retrieving revision 1.23
diff -u -r1.23 winsup.h
--- winsup.h    2000/07/29 16:24:42     1.23
+++ winsup.h    2000/08/02 01:18:31
@@ -66,8 +66,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};
--------------------------snip-------------------------


begin 775 clip.patch.gz
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
@$>%FE\X,7QYX..)A8&G*L@^17$5XS_\&Z#L!ITH5``#7
`
end


begin 775 fhandler_clipboard.cc.gz
M'XL("(^"ASD``V9H86YD;&5R7V-L:7!B;V%R9"YC8P"%4U%OVC`0?L^O.&6:
M9!`*;(]TF]:&EG9";=4R=7N*C',A7HT=V4X1G?;?=W9@%(VJ3X[OOOONN\^7
M81^JFNM2H2U*?"JVWYD08Q"F1/`&N!#H'`PI/WQ&:Y($`'+3;*Q<UAX^CD8C
MR#=+W3JX-ZKUTFB71="#E=ZCAL4&)M]@@LI8B<#*7U]%Q&?"K'I),J^E@THJ
M!#H;;CV8*C"NI<ZV66<JO^8V(C@IVS;'$M;&/H*2`K6C6ZM+M.!K$HYVY0(1
M79*.;`?+`&X5<H=$I%VK?"R(`M+\Y_3AZKJ87>7GU_?G*53&)B5Z+I7+H#],
MDG=2"]62,Y_06FVR^LL^E%(3US99G;Z`4:PT:Q>`R8'70LEF8;@MQ^/C<6!!
MGP=1<PM]S5?8(U?'^Q=;A!G8Q661SZYNSVY.[R8#Z&"_">C0%V(!S,EG)!_Z
MGHSLG21_DD1J_ZH4T]"#'30>`.&A4GSI!K"BI2C\OD$,`XL'D0-8]*W5\.'-
M1FM:#MQU>C*R#)V"UL*#0MVUV++1_4T^BYP<ZX@:;__GNIS.;LY.9U`OU2(H
MG=W>S^]`-<[;D["N-S1YON-CHSA-P,)GF*+_EYEPSUE^4<S/?\PC)C(0B$7"
M'DR567`U,^*1A?)>)"<5!'&ZL31#Q5AG;0^B4DH.('WOTD%'%FD[FN]:O2"B
M_TX9AWN5+RW?F62JJGC=)N40'X%%4'S9`Z-';]HL@H#.YR.5(?QJ:=FN&F!=
<%?WF7!.XV!J2UFAQ`,=+T[BV?P$J<KBIK`0``-HL
`
end

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com


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