summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2019-01-31 10:42:44 +0100
committertv <tv@krebsco.de>2019-01-31 10:42:44 +0100
commit15f3f94c19fb873e3687c07a3056921ade5266fa (patch)
treea9b4bb19dd9148df91d181667d4917aa1d66249d
parente70616a923c8f6d4d0da1581cbdf7080e6f34ad1 (diff)
cancel running selection requestcancel-running-selection-request
When using X security extensions to run urxvt as trusted X client and requesting a selection from an untrusted client, then no X event will be received, but the selection request will timeout instead. This patch cancels any running request before creating a new one, so that the user doesn't have to wait 10 seconds for the timeout before being able to initiate a new one.
-rw-r--r--src/rxvttoolkit.h2
-rw-r--r--src/screen.C10
2 files changed, 6 insertions, 6 deletions
diff --git a/src/rxvttoolkit.h b/src/rxvttoolkit.h
index 56c9a3f..429055d 100644
--- a/src/rxvttoolkit.h
+++ b/src/rxvttoolkit.h
@@ -384,6 +384,7 @@ struct rxvt_selection
{
rxvt_selection (rxvt_display *disp, int selnum, Time tm, Window win, Atom prop, rxvt_term *term);
void run ();
+ void finish (char *data = 0, unsigned int len = 0);
~rxvt_selection ();
rxvt_term *term; // terminal to paste to, may be 0
@@ -404,7 +405,6 @@ private:
void timer_cb (ev::timer &w, int revents); ev::timer timer_ev;
void x_cb (XEvent &xev); xevent_watcher x_ev;
- void finish (char *data = 0, unsigned int len = 0);
void stop ();
bool request (Atom target, int selnum);
void handle_selection (Window win, Atom prop, bool delete_prop);
diff --git a/src/screen.C b/src/screen.C
index f3c6d57..75b38d7 100644
--- a/src/screen.C
+++ b/src/screen.C
@@ -2744,11 +2744,11 @@ rxvt_term::paste (char *data, unsigned int len) NOTHROW
void
rxvt_term::selection_request (Time tm, int selnum) NOTHROW
{
- if (!selection_req)
- {
- selection_req = new rxvt_selection (display, selnum, tm, vt, xa[XA_VT_SELECTION], this);
- selection_req->run ();
- }
+ if (selection_req)
+ selection_req->finish ();
+
+ selection_req = new rxvt_selection (display, selnum, tm, vt, xa[XA_VT_SELECTION], this);
+ selection_req->run ();
}
/* ------------------------------------------------------------------------- */