diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-09-21 22:09:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-09-21 22:09:37 +0200 |
commit | 62b42181fbd76d684acb682fe69292164157555d (patch) | |
tree | b341e43c85d6a52087d3f5fd44458bf3cfbadf8a /src/ui.c | |
parent | b05034a4ed7df489a300440b58ef7f1461c96c58 (diff) | |
download | vim-git-62b42181fbd76d684acb682fe69292164157555d.tar.gz |
updated for version 7.3.011v7.3.011
Problem: X11 clipboard doesn't work in Athena/Motif GUI. First selection
after a shell command doesn't work.
Solution: When using the GUI use XtLastTimestampProcessed() instead of
changing a property. (partly by Toni Ronkko)
When executing a shell command disown the selection.
Diffstat (limited to 'src/ui.c')
-rw-r--r-- | src/ui.c | 47 |
1 files changed, 34 insertions, 13 deletions
@@ -469,7 +469,7 @@ clip_own_selection(cbd) */ #ifdef FEAT_X11 /* Always own the selection, we might have lost it without being - * notified. */ + * notified, e.g. during a ":sh" command. */ if (cbd->available) { int was_owned = cbd->owned; @@ -1944,10 +1944,9 @@ x11_setup_atoms(dpy) */ static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *)); - static void clip_x11_lose_ownership_cb __ARGS((Widget, Atom *)); - static void clip_x11_timestamp_cb __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont)); +static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *)); /* * Property callback to get a timestamp for XtOwnSelection. @@ -1985,8 +1984,17 @@ clip_x11_timestamp_cb(w, n, event, cont) return; /* Get the selection, using the event timestamp. */ - XtOwnSelection(w, xproperty->atom, xproperty->time, - clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb, NULL); + if (XtOwnSelection(w, xproperty->atom, xproperty->time, + clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb, + NULL) == OK) + { + /* Set the "owned" flag now, there may have been a call to + * lose_ownership_cb in between. */ + if (xproperty->atom == clip_plus.sel_atom) + clip_plus.owned = TRUE; + else + clip_star.owned = TRUE; + } } void @@ -1997,8 +2005,6 @@ x11_setup_selection(w) /*(XtEventHandler)*/clip_x11_timestamp_cb, (XtPointer)NULL); } -static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *)); - static void clip_x11_request_selection_cb(w, success, sel_atom, type, value, length, format) @@ -2336,7 +2342,7 @@ clip_x11_lose_ownership_cb(w, sel_atom) void clip_x11_lose_selection(myShell, cbd) - Widget myShell; + Widget myShell; VimClipboard *cbd; { XtDisownSelection(myShell, cbd->sel_atom, CurrentTime); @@ -2344,14 +2350,29 @@ clip_x11_lose_selection(myShell, cbd) int clip_x11_own_selection(myShell, cbd) - Widget myShell; + Widget myShell; VimClipboard *cbd; { - /* Get the time by a zero-length append, clip_x11_timestamp_cb will be - * called with the current timestamp. */ - if (!XChangeProperty(XtDisplay(myShell), XtWindow(myShell), cbd->sel_atom, - timestamp_atom, 32, PropModeAppend, NULL, 0)) + /* When using the GUI we have proper timestamps, use the one of the last + * event. When in the console we don't get events (the terminal gets + * them), Get the time by a zero-length append, clip_x11_timestamp_cb will + * be called with the current timestamp. */ +#ifdef FEAT_GUI + if (gui.in_use) + { + if (XtOwnSelection(myShell, cbd->sel_atom, + XtLastTimestampProcessed(XtDisplay(myShell)), + clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb, + NULL) == False) return FAIL; + } + else +#endif + { + if (!XChangeProperty(XtDisplay(myShell), XtWindow(myShell), + cbd->sel_atom, timestamp_atom, 32, PropModeAppend, NULL, 0)) + return FAIL; + } /* Flush is required in a terminal as nothing else is doing it. */ XFlush(XtDisplay(myShell)); return OK; |