
Example A-3. The long_seln.c program (continued)
{
char *text = get_selection();
if (text)
printf("–––seln–––\n%.*s [...]\n–––end seln–––\n", 20, text);
}
/*
* return the text selected in the current selection rank. Use
* selection_query() to guarantee that the entire selection is
* retrieved. selection_query() calls our installed routine,
* read_proc() (see below).
*/
char *
get_selection()
{
Seln_holder holder;
Seln_result result;
Seln_request *response;
char context = FIRST_BUFFER;
holder = selection_inquire(server, seln_type);
printf("selection type = %s\n",
seln_type == SELN_PRIMARY? "primary" :
seln_type == SELN_SECONDARY? "secondary" : "shelf");
/* result is based on the return value of read_proc() */
result = selection_query(server, &holder, read_proc, &context,
SELN_REQ_BYTESIZE, NULL,
SELN_REQ_CONTENTS_ASCII, NULL,
NULL);
if (result == SELN_FAILED) {
puts("couldn’t get selection");
return NULL;
}
return seln_bufs[seln_type ];
}
/*
* Called by selection_query for every buffer of information received.
* Short messages (under about 2000 bytes) will fit into one buffer.
* For larger messages, read_proc is called for each buffer in the
* selection. The context pointer passed to selection_query is
* modified by read_proc so that we know if this is the first buffer
* or not.
*/
Seln_result
read_proc(response)
Seln_request *response;
{
char *reply; /* pointer to the data in the response received */
long seln_len; /* to