
Example A-2. The text_seln.c program (continued)
lines_selected = *(long *)(ptr += sizeof(SELN_REQ_LAST_UNIT));
ptr += sizeof(long);
/* hack to workaround bug with SELN_REQ_LAST_UNIT always
* returning -1. Count the lines explicitly in the selection.
*/
if (lines_selected < 0) {
register char *p;
lines_selected++;
for (p = selection_buf; *p; p++)
if (*p == ’\n’)
lines_selected++;
}
printf("index in textsw: %d–%d, line number(s) = %d–%d\n",
first+1, last+1, sel_lin_num+1,
sel_lin_num + lines_selected + 1);
} else {
/* the selection does not lie in our text subwindow */
response = selection_ask(server, &holder,
SELN_REQ_CONTENTS_ASCII, NULL,
NULL);
if (response->status != SELN_SUCCESS) {
printf("selection_ask() returns %d\n", response–>status);
return NULL;
}
(void) strcpy(selection_buf,
response->data + sizeof(SELN_REQ_CONTENTS_ASCII));
}
return selection_buf;
}
There are several points of interest here. In the function get_selection(), once the
holder of the client has been obtained, it is tested to see if the holder is the text subwindow
using seln_holder_same_client(). If so, selection_ask() is called requesting
information specific to the text subwindow. If the text subwindow is not the holder of the
selection, then selection_ask() is called requesting only the ASCII contents. If there is
no selection, then the status field of the structure is set to SELN_FAILED.
In the case where the holder is the text subwindow ...