set _NET_WM_USER_TIME on the window
[dana/urxvt.git] / src / command.C
index 85f27d5..78fa3b5 100644 (file)
@@ -402,6 +402,13 @@ map_function_key (KeySym keysym)
 }
 
 void
+rxvt_term::update_user_time (Time time)
+{
+  XChangeProperty (dpy, parent[0], xa[XA_NET_WM_USER_TIME], XA_CARDINAL,
+                   32, PropModeReplace, (unsigned char*)&time, 1);
+}
+
+void
 rxvt_term::key_press (XKeyEvent &ev)
 {
   int ctrl, meta, shft, len;
@@ -598,6 +605,24 @@ rxvt_term::key_press (XKeyEvent &ev)
 # endif
               return;
             }
+          else if (keysym == XK_C)
+            {
+              selection_make (ev.time, true);
+# if ISO_14755
+              scr_overlay_off ();
+# endif
+              iso14755buf = 0;
+              return;
+            }
+          else if (keysym == XK_V)
+            {
+              selection_request (ev.time, Sel_Clipboard);
+# if ISO_14755
+              scr_overlay_off ();
+# endif
+              iso14755buf = 0;
+              return;
+            }
           else if (keysym == XK_BackSpace)
             {
               iso14755buf = ((iso14755buf & ISO_14755_MASK) >> 4) | ISO_14755_51;
@@ -1344,6 +1369,7 @@ rxvt_term::x_cb (XEvent &ev)
   switch (ev.type)
     {
       case KeyPress:
+        update_user_time (ev.xkey.time);
         key_press (ev.xkey);
         break;
 
@@ -1352,6 +1378,7 @@ rxvt_term::x_cb (XEvent &ev)
         break;
 
       case ButtonPress:
+        update_user_time (ev.xbutton.time);
         button_press (ev.xbutton);
         break;
 
@@ -1839,6 +1866,8 @@ rxvt_term::button_press (XButtonEvent &ev)
 {
   int reportmode = 0, clickintime;
 
+  button_state[ev.button - Button1] = true;
+
   bypass_keystate = ev.state & (ModMetaMask | ShiftMask);
 
   if (!bypass_keystate)
@@ -2085,6 +2114,11 @@ rxvt_term::button_release (XButtonEvent &ev)
 {
   int reportmode = 0;
 
+  if (button_state[ev.button - Button1] == false)
+      return; /* it wasn't pressed so why is it released? */
+
+  button_state[ev.button - Button1] = false;
+
   csrO = 0;            /* reset csr Offset */
   if (!bypass_keystate)
     reportmode = !! (priv_modes & PrivMode_mouse_report);