/* Lifted the code from rxvt. */ static char * get_primary_selection(void) { long nread; unsigned long bytes_after; XTextProperty ct; struct sbuf *s = sbuf_new(0); for (nread = 0, bytes_after = 1; bytes_after > 0; nread += ct.nitems) { if ((XGetWindowProperty(dpy, current_screen()->input_window, rp_selection, (nread / 4), 4096, True, AnyPropertyType, &ct.encoding, &ct.format, &ct.nitems, &bytes_after, &ct.value) != Success)) { XFree(ct.value); sbuf_free(s); return NULL; } if (ct.value == NULL) continue; /* Accumulate the data. FIXME: ct.value may not be NULL terminated. */ sbuf_nconcat (s, ct.value, ct.nitems); XFree(ct.value); } return sbuf_free_struct (s); }
static char * get_cut_buffer (void) { int nbytes; char *data; PRINT_DEBUG (("trying the cut buffer\n")); data = XFetchBytes (dpy, &nbytes); if (data) { struct sbuf *s = sbuf_new (0); sbuf_nconcat (s, data, nbytes); XFree (data); return sbuf_free_struct (s); } else return NULL; }
char * sbuf_concat (struct sbuf *b, const char *str) { return sbuf_nconcat (b, str, strlen (str)); }