Mailing-List: contact cygwin-help AT sourceware DOT cygnus DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT sources DOT redhat DOT com Delivered-To: mailing list cygwin AT sources DOT redhat DOT com Message-ID: <398783D9.E25355B6@ece.gatech.edu> Date: Tue, 01 Aug 2000 22:13:45 -0400 From: Charles Wilson X-Mailer: Mozilla 4.73 [en] (Windows NT 5.0; U) X-Accept-Language: en MIME-Version: 1.0 To: cygwin AT sourceware DOT cygnus DOT com Subject: Re: Clipboard from Cygwin? References: <003b01bffc0a$6da278a0$3c5350d8 AT guinness> <200008012327 DOT TAA29658 AT envy DOT delorie DOT com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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 AT cygnus DOT 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 #include "winsup.h" #include 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 M'XL("'J"ASD``V-L:7`N<&%T8V@`O5A]3^-&$_\[^10CVDK))2&V$P+X=-)Q MD"NT AT 9R`ZSVJD"SCK!,+Q^ONV AT 1ZO>_>F;$=VR%IBQ[I(L'NCN=M=WX[,_9% M-!-/-JR"2*=QWWN>XZQ_Z3X(/PC%?A`UW_W_O^;UZ0V0/AOZWJ/N:^7QWTZC MW<>F$HD*Q&,0S4'AH`,9@;EO'31G@>]#+X6>HB547>WU>M5UPS(,HV\<]DT# MS`-[8-C&L,$Z.IW.%L:COF&!8=KFD6U9S??OH6=:5M>TH,/C`-Z_;T)#1(^! MDM&^!!!*11(GXLD3<8(>:EX(CX=$J,@-<>I[4<+CPHUFH5`XO4-%Q=+Q4%"B M(R6'XXN*4:GEH'4-5+RS'IZI1X,QTRN M:EQ_"D5;]:5ZP&$>RGL:5(S_%\+E(8A\F6L*HB#!:2`]WGDH/3=,@B6YLG1# M7-)DR6*1(,XH$2X.L:OU:I8KB=UD0;1<;QSP5F(9DDHEYN(ISB=*295-=7J? M30*=J&)?2FB9*H^DM8?["8A9"R]5`>]=BU!XY(5>N$J0>1W,L]CA)%;L+BG2 MY'RL AT HB98W=%,$!#;J8[45J02_HY\GA`:V&H\ZF,_$+-LP[E'!=E-.AP>&2' MTGS+:>3RF:UGM3;L)3?CYICI7+=1FSCL$8VN:Q;5$90PU4QE[P5:O8@,-O'5+T\7\6?/ZM0S`3CU1) MF-BJU1;/:V]CSB!39 M1)(16Y2:2)*.X7C8/8+.\4'W.#^&C^?.U>?)A!C?@?%D\,\<=!O]-Q!H2!8" MHC0,`?T*/`%O^KG0[^/KZ8;0L"I$U^*%T/7)U=GTLB9T4`BYD%V$BE"'A4XG M%Y\^3$^NSZIBHRY`:2S/_K`^.#;9[&7;.QO_MN'IB(U>ND_!,EWB_I;W0H'T M<].ZM+U%]O#?9;/-HNCERW M'+O#D4D8/AP-NE81/LSA,$OC"K#N78T*O440SMIO,[0\RF"&7$MD0U('U76: M'2_$`K4#=S;$Z7T8>%#3VNQ\;7:R!S:=SW99:%$KEX"'10C>4.9OL[T7;A") MW`]T4;VA12QM^(I)(DD5IHBW\*U AT D[&(ZKJIL';YF1^Z<]V%I9P))^&!3I", M9+(KK)"B$&8WWL2)ZF))_),$0A&5O$JXL\R1?V#BC@!::4355?.3)RJ)6&%K$_NF$FRTQ^\)3& MCNLGE'RP5D#K'&_79(S]AA*%E:PE<)3P)%V*]9*VN/GLGR3R`WR-2/8^L$NF M..EG\CUWB".)9WCV98J7?2%7H8SF68#QE)5+)0U\K1N\]L4WJ!(K*!UG_KM^E7GU-[*;S8T[C%Z#V_S.K96M,[:-K?I MN[55$D>1+`J5&[YEU>/?O,NK""OK8NL9)%4OMX*!._3OB87T=W>'!WAWIY.?9GM= MIF#ISV?Y,XH]4CHE91V_.N-/.@L$4?G2DM$#@\%W8`RP"^$/"<@;82SS+F0= M+7AA7I$']2](`UDX2T(K%1LJQAO;0:K`T M(6V#JP*U@:J_'MEU^=\QKMYK=3HC1[V"K= M8G,G(P%^&GGT;0E6`E(,EJ_PBJ-AG&/3CQ4?ZSKV8-0+TBLH-W"YN(]IHA#7 MKY#//U[!WNE>7I'0MY-/%_"S2":N3L;TMEX6[Q_0_0`]/?WHW.*;*V`ZKBCX M,)U."ODI-C*G!3A;YU^NSDB^PIS7\=+RGA/?1GPF-0Z/UL[]C7 AT M1.\HSO+5_QH*YN @$>%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;*Q7GU_?G*53&)B5Z+I7+H#], MDG=2"]62,Y_06FVR^LL^E%(3US99G;Z`4:PT:Q>`R8'70LEF8;@MQ^/C<6!! MGP=1C0%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^BYPS^]`-<[;D["N-S1YON-CHSA-P,)GF*+_EYEPSUE^4)"<5!'&ZL31#Q5AG;0^B4DH.('WOTD%'%FD[FN]:O2"B M_TX9AWN5+RW?F62JJGC=)N40'X%%4'S9`Z-';]HL AT H#.YR.5(?QJ:=FN&F!= <%?WF7!.XV!J2UFAQ`,=+T[BV?P$J