| 1 |
/* |
|---|
| 2 |
* xsel -- manipulate the X selection |
|---|
| 3 |
* Copyright (C) 2001 Conrad Parker <conrad@vergenet.net> |
|---|
| 4 |
* |
|---|
| 5 |
* Permission to use, copy, modify, distribute, and sell this software and |
|---|
| 6 |
* its documentation for any purpose is hereby granted without fee, provided |
|---|
| 7 |
* that the above copyright notice appear in all copies and that both that |
|---|
| 8 |
* copyright notice and this permission notice appear in supporting |
|---|
| 9 |
* documentation. No representations are made about the suitability of this |
|---|
| 10 |
* software for any purpose. It is provided "as is" without express or |
|---|
| 11 |
* implied warranty. |
|---|
| 12 |
*/ |
|---|
| 13 |
|
|---|
| 14 |
#define AUTHOR "Conrad Parker <conrad@vergenet.net>" |
|---|
| 15 |
|
|---|
| 16 |
/* Default debug level (ship at 0) */ |
|---|
| 17 |
#define DEBUG_LEVEL 0 |
|---|
| 18 |
|
|---|
| 19 |
#define MAX(a,b) ((a)>(b)?(a):(b)) |
|---|
| 20 |
#define MIN(a,b) ((a)<(b)?(a):(b)) |
|---|
| 21 |
|
|---|
| 22 |
#define empty_string(s) (s==NULL||s[0]=='\0') |
|---|
| 23 |
#define free_string(s) { free(s); s=NULL; } |
|---|
| 24 |
|
|---|
| 25 |
/* Maximum line length for error messages */ |
|---|
| 26 |
#define MAXLINE 4096 |
|---|
| 27 |
|
|---|
| 28 |
/* Maximum filename length */ |
|---|
| 29 |
#define MAXFNAME 1024 |
|---|
| 30 |
|
|---|
| 31 |
/* Maximum incremental selection size. (Ripped from Xt) */ |
|---|
| 32 |
#define MAX_SELECTION_INCR(dpy) (((65536 < XMaxRequestSize(dpy)) ? \ |
|---|
| 33 |
(65536 << 2) : (XMaxRequestSize(dpy) << 2))-100) |
|---|
| 34 |
|
|---|
| 35 |
/* |
|---|
| 36 |
* Debug levels (for print_debug()): |
|---|
| 37 |
* |
|---|
| 38 |
* 0 - Fatal errors (default/unmaskable) |
|---|
| 39 |
* 1 - Non-fatal warning (essential debugging info) |
|---|
| 40 |
* 2 - Informative (generally useful debugging info) |
|---|
| 41 |
* 3 - Obscure (more detailed debugging info) |
|---|
| 42 |
* 4 - Trace (sequential trace of progress) |
|---|
| 43 |
*/ |
|---|
| 44 |
|
|---|
| 45 |
#define D_FATAL 0 |
|---|
| 46 |
#define D_WARN 1 |
|---|
| 47 |
#define D_INFO 2 |
|---|
| 48 |
#define D_OBSC 3 |
|---|
| 49 |
#define D_TRACE 4 |
|---|
| 50 |
|
|---|
| 51 |
/* An instance of a MULTIPLE SelectionRequest being served */ |
|---|
| 52 |
typedef struct _MultTrack MultTrack; |
|---|
| 53 |
|
|---|
| 54 |
struct _MultTrack { |
|---|
| 55 |
MultTrack * mparent; |
|---|
| 56 |
Display * display; |
|---|
| 57 |
Window requestor; |
|---|
| 58 |
Atom property; |
|---|
| 59 |
Atom selection; |
|---|
| 60 |
Time time; |
|---|
| 61 |
Atom * atoms; |
|---|
| 62 |
unsigned long length; |
|---|
| 63 |
unsigned long index; |
|---|
| 64 |
unsigned char * sel; |
|---|
| 65 |
}; |
|---|
| 66 |
|
|---|
| 67 |
/* Selection serving states */ |
|---|
| 68 |
typedef enum { |
|---|
| 69 |
S_NULL=0, |
|---|
| 70 |
S_INCR_1, |
|---|
| 71 |
S_INCR_2 |
|---|
| 72 |
} IncrState; |
|---|
| 73 |
|
|---|
| 74 |
/* An instance of a selection being served */ |
|---|
| 75 |
typedef struct _IncrTrack IncrTrack; |
|---|
| 76 |
|
|---|
| 77 |
struct _IncrTrack { |
|---|
| 78 |
MultTrack * mparent; |
|---|
| 79 |
IncrTrack * prev, * next; |
|---|
| 80 |
IncrState state; |
|---|
| 81 |
Display * display; |
|---|
| 82 |
Window requestor; |
|---|
| 83 |
Atom property; |
|---|
| 84 |
Atom selection; |
|---|
| 85 |
Time time; |
|---|
| 86 |
Atom target; |
|---|
| 87 |
int format; |
|---|
| 88 |
unsigned char * data; |
|---|
| 89 |
int nelements; /* total */ |
|---|
| 90 |
int offset, chunk, max_elements; /* all in terms of nelements */ |
|---|
| 91 |
}; |
|---|
| 92 |
|
|---|
| 93 |
/* Status of request handling */ |
|---|
| 94 |
typedef int HandleResult; |
|---|
| 95 |
#define HANDLE_OK 0 |
|---|
| 96 |
#define HANDLE_ERR (1<<0) |
|---|
| 97 |
#define HANDLE_INCOMPLETE (1<<1) |
|---|
| 98 |
#define DID_DELETE (1<<2) |
|---|