/* wxcopy.c- copy stdin or file into cutbuffer * * Copyright (c) 1997-2003 Alfredo K. Kojima * * This program 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 program 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 program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define PROG_VERSION "wxcopy 0.3" #include #include #include #include #include #include #include #define LINESIZE (4*1024) #define MAXDATA (64*1024) void help(char *progn) { printf("Usage: %s [OPTIONS] [FILE]\n", progn); puts("Copies data from FILE or stdin into X cut buffer."); puts(""); puts(" -display display to use"); puts(" --cutbuffer cutbuffer number to put data"); puts(" --no-limit do not limit size of input data"); puts(" --clear-selection clears the current PRIMARY selection"); puts(" --help display this help and exit"); puts(" --version output version information and exit"); } static int errorHandler(Display *dpy, XErrorEvent *err) { /* ignore all errors */ return 0; } int main(int argc, char **argv) { Display *dpy; int i; int buffer=-1; char *filename=NULL; FILE *file=stdin; char *buf=NULL; char *display_name=""; int l=0; int buf_len = 0; int limit_check = 1; int clear_selection = 0; for (i=1; i 7) { fprintf(stderr, "%s: invalid buffer number %i\n", argv[0], buffer); exit(1); } } else { printf("%s: missing argument for '%s'\n", argv[0], argv[i]); printf("Try '%s --help' for more information\n", argv[0]); exit(1); } } else if (strcmp(argv[i], "-display")==0) { if (i < argc-1) { display_name = argv[++i]; } else { printf("%s: missing argument for '%s'\n", argv[0], argv[i]); printf("Try '%s --help' for more information\n", argv[0]); exit(1); } } else if (strcmp(argv[i],"-clearselection")==0 || strcmp(argv[i],"--clear-selection")==0) { clear_selection = 1; } else if (strcmp(argv[i],"-nolimit")==0 || strcmp(argv[i],"--no-limit")==0) { limit_check = 0; } else { printf("%s: invalid argument '%s'\n", argv[0], argv[i]); printf("Try '%s --help' for more information\n", argv[0]); exit(1); } } else { filename = argv[i]; } } if (filename) { file = fopen(filename, "rb"); if (!file) { char line[1024]; sprintf(line, "%s: could not open \"%s\"", argv[0], filename); perror(line); exit(1); } } dpy = XOpenDisplay(display_name); XSetErrorHandler(errorHandler); if (!dpy) { fprintf(stderr, "%s: could not open display \"%s\"\n", argv[0], XDisplayName(display_name)); exit(1); } if (buffer<0) { Atom *rootWinProps; int exists[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int i, count; /* Create missing CUT_BUFFERs */ rootWinProps = XListProperties(dpy, DefaultRootWindow(dpy), &count); for (i=0; i=MAXDATA) { fprintf ( stderr, "%s: too much data in input - more than %d bytes\n" " use the -nolimit argument to remove the limit check.\n", argv[0], MAXDATA ); exit(1); } } if (clear_selection) { XSetSelectionOwner(dpy, XA_PRIMARY, None, CurrentTime); } if (buf) { XStoreBuffer(dpy, buf, l, buffer); } XFlush(dpy); XCloseDisplay(dpy); exit(buf == NULL || errno != 0); }