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)
99