tapplied xclipboard patch. thx David Isaac Wolinsky. - st - [fork] customized b… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit d693b304c78708acb911773fe24971ef969d237e | |
parent 3a50a4fd931ed58454b680c9fc5c1bc2278e67f3 | |
Author: Aurélien Aptel <[email protected]> | |
Date: Wed, 13 Oct 2010 01:24:11 +0200 | |
applied xclipboard patch. thx David Isaac Wolinsky. | |
Diffstat: | |
M st.c | 130 +++++++++++++++++++++++++++++… | |
1 file changed, 124 insertions(+), 6 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -17,6 +17,7 @@ | |
#include <sys/wait.h> | |
#include <unistd.h> | |
#include <X11/Xlib.h> | |
+#include <X11/Xatom.h> | |
#include <X11/keysym.h> | |
#include <X11/Xutil.h> | |
t@@ -199,7 +200,8 @@ static void focus(XEvent *); | |
static void brelease(XEvent *); | |
static void bpress(XEvent *); | |
static void bmotion(XEvent *); | |
- | |
+static void selection_notify(XEvent *); | |
+static void selection_request(XEvent *); | |
static void (*handler[LASTEvent])(XEvent *) = { | |
[KeyPress] = kpress, | |
t@@ -212,6 +214,8 @@ static void (*handler[LASTEvent])(XEvent *) = { | |
[MotionNotify] = bmotion, | |
[ButtonPress] = bpress, | |
[ButtonRelease] = brelease, | |
+ [SelectionNotify] = selection_notify, | |
+ [SelectionRequest] = selection_request, | |
}; | |
/* Globals */ | |
t@@ -278,15 +282,129 @@ static char *getseltext() { | |
return str; | |
} | |
-/* TODO: use X11 clipboard */ | |
+static void selection_notify(XEvent *e) { | |
+ unsigned long nitems; | |
+ unsigned long length; | |
+ int format, res; | |
+ unsigned char *data; | |
+ Atom type; | |
+ | |
+ res = XGetWindowProperty(xw.dis, xw.win, XA_PRIMARY, 0, 0, False, | |
+ AnyPropertyType, &type, &format, &nitems, &len… | |
+ switch(res) { | |
+ case BadAtom: | |
+ case BadValue: | |
+ case BadWindow: | |
+ fprintf(stderr, "Invalid paste, XGetWindowProperty0"); | |
+ return; | |
+ } | |
+ | |
+ res = XGetWindowProperty(xw.dis, xw.win, XA_PRIMARY, 0, length, False, | |
+ AnyPropertyType, &type, &format, &nitems, &len… | |
+ switch(res) { | |
+ case BadAtom: | |
+ case BadValue: | |
+ case BadWindow: | |
+ fprintf(stderr, "Invalid paste, XGetWindowProperty0"); | |
+ return; | |
+ } | |
+ | |
+ if(data) { | |
+ ttywrite((const char *) data, nitems * format / 8); | |
+ XFree(data); | |
+ } | |
+} | |
+ | |
+static void selpaste() { | |
+ XConvertSelection(xw.dis, XA_PRIMARY, XA_STRING, XA_PRIMARY, xw.win, C… | |
+} | |
+ | |
+static void selection_request(XEvent *e) | |
+{ | |
+ XSelectionRequestEvent *xsre; | |
+ XSelectionEvent xev; | |
+ int res; | |
+ Atom xa_targets; | |
+ | |
+ xsre = (XSelectionRequestEvent *) e; | |
+ xev.type = SelectionNotify; | |
+ xev.requestor = xsre->requestor; | |
+ xev.selection = xsre->selection; | |
+ xev.target = xsre->target; | |
+ xev.time = xsre->time; | |
+ /* reject */ | |
+ xev.property = None; | |
+ | |
+ xa_targets = XInternAtom(xw.dis, "TARGETS", 0); | |
+ if(xsre->target == xa_targets) { | |
+ /* respond with the supported type */ | |
+ Atom string = XA_STRING; | |
+ res = XChangeProperty(xsre->display, xsre->requestor, xsre->pr… | |
+ PropModeReplace, (unsigned char *) &string, 1); | |
+ switch(res) { | |
+ case BadAlloc: | |
+ case BadAtom: | |
+ case BadMatch: | |
+ case BadValue: | |
+ case BadWindow: | |
+ fprintf(stderr, "Error in selection_request, T… | |
+ break; | |
+ default: | |
+ xev.property = xsre->property; | |
+ } | |
+ } else if(xsre->target == XA_STRING) { | |
+ res = XChangeProperty(xsre->display, xsre->requestor, xsre->pr… | |
+ xsre->target, 8, PropModeReplace, (unsigned ch… | |
+ strlen(sel.clip)); | |
+ switch(res) { | |
+ case BadAlloc: | |
+ case BadAtom: | |
+ case BadMatch: | |
+ case BadValue: | |
+ case BadWindow: | |
+ fprintf(stderr, "Error in selection_request, X… | |
+ break; | |
+ default: | |
+ xev.property = xsre->property; | |
+ } | |
+ } | |
+ | |
+ /* all done, send a notification to the listener */ | |
+ res = XSendEvent(xsre->display, xsre->requestor, True, 0, (XEvent *) &… | |
+ switch(res) { | |
+ case 0: | |
+ case BadValue: | |
+ case BadWindow: | |
+ fprintf(stderr, "Error in selection_requested, XSendEv… | |
+ } | |
+} | |
+ | |
static void selcopy(char *str) { | |
+ /* register the selection for both the clipboard and the primary */ | |
+ Atom clipboard; | |
+ int res; | |
+ | |
free(sel.clip); | |
sel.clip = str; | |
-} | |
-static void selpaste() { | |
- if(sel.clip) | |
- ttywrite(sel.clip, strlen(sel.clip)); | |
+ res = XSetSelectionOwner(xw.dis, XA_PRIMARY, xw.win, CurrentTime); | |
+ switch(res) { | |
+ case BadAtom: | |
+ case BadWindow: | |
+ fprintf(stderr, "Invalid copy, XSetSelectionOwner"); | |
+ return; | |
+ } | |
+ | |
+ clipboard = XInternAtom(xw.dis, "CLIPBOARD", 0); | |
+ res = XSetSelectionOwner(xw.dis, clipboard, xw.win, CurrentTime); | |
+ switch(res) { | |
+ case BadAtom: | |
+ case BadWindow: | |
+ fprintf(stderr, "Invalid copy, XSetSelectionOwner"); | |
+ return; | |
+ } | |
+ | |
+ XFlush(xw.dis); | |
} | |
/* TODO: doubleclick to select word */ |