Subject: bug#23629: 25.0.94; Calc: Yanking with mouse-2 does not use X primary selection/clipboard

From: Bastian Beischer <[email-masked]>
Date: Mon, 13 Jun 2016 09:40:54 +0200

This patch solves the issue for me.

I don't know how the duplicated documentation is supposed to be
handled. If the documentation is put on the internal function it's
less likely to be seen, but if it is put on the two disjunct functions
it's duplicated. What's the preferred way?

--- a/calc-yank.el.bak 2016-06-13 09:25:24.376509910 +0200
+++ b/calc-yank.el 2016-06-13 09:26:18.824226799 +0200
@@ -150,34 +150,16 @@
 ;; otherwise it just parses the yanked string.
 ;; Modified to use Emacs 19 extended concept of kill-ring. -- daveg 12/15/96
 ;;;###autoload
-(defun calc-yank (radix)
-  "Yank a value into the Calculator buffer.
-
-Valid numeric prefixes for RADIX: 0, 2, 6, 8
-No radix notation is prepended for any other numeric prefix.
-
-If RADIX is 2, prepend \"2#\"  - Binary.
-If RADIX is 8, prepend \"8#\"  - Octal.
-If RADIX is 0, prepend \"10#\" - Decimal.
-If RADIX is 6, prepend \"16#\" - Hexadecimal.
+(defun calc-yank-internal (radix thing-raw)
+  "Internal common implementation for yank functions.

-If RADIX is a non-nil list (created using \\[universal-argument]), the user
-will be prompted to enter the radix in the minibuffer.
-
-If RADIX is nil or if the yanked string already has a calc radix prefix, the
-yanked string will be passed on directly to the Calculator buffer without any
-alteration."
-  (interactive "P")
+This function is used by both calc-yank and calc-yank-mouse-primary."
   (calc-wrapper
    (calc-pop-push-record-list
     0 "yank"
     (let* (radix-num
            radix-notation
            valid-num-regexp
-           (thing-raw
-            (if (fboundp 'current-kill)
-                (current-kill 0 t)
-              (car kill-ring-yank-pointer)))
            (thing
             (if (or (null radix)
                     ;; Match examples: -2#10, 10\n(10#10,01)
@@ -232,6 +214,50 @@
                       val))
                 val))))))))

+;;;###autoload
+(defun calc-yank-mouse-primary (radix)
+  "Yank the current primary selection into the Calculator buffer.
+
+Valid numeric prefixes for RADIX: 0, 2, 6, 8
+No radix notation is prepended for any other numeric prefix.
+
+If RADIX is 2, prepend \"2#\"  - Binary.
+If RADIX is 8, prepend \"8#\"  - Octal.
+If RADIX is 0, prepend \"10#\" - Decimal.
+If RADIX is 6, prepend \"16#\" - Hexadecimal.
+
+If RADIX is a non-nil list (created using \\[universal-argument]), the user
+will be prompted to enter the radix in the minibuffer.
+
+If RADIX is nil or if the yanked string already has a calc radix prefix, the
+yanked string will be passed on directly to the Calculator buffer without any
+alteration."
+  (interactive "P")
+  (calc-yank-internal radix (gui-get-primary-selection)))
+
+;;;###autoload
+(defun calc-yank (radix)
+  "Yank a value into the Calculator buffer.
+
+Valid numeric prefixes for RADIX: 0, 2, 6, 8
+No radix notation is prepended for any other numeric prefix.
+
+If RADIX is 2, prepend \"2#\"  - Binary.
+If RADIX is 8, prepend \"8#\"  - Octal.
+If RADIX is 0, prepend \"10#\" - Decimal.
+If RADIX is 6, prepend \"16#\" - Hexadecimal.
+
+If RADIX is a non-nil list (created using \\[universal-argument]), the user
+will be prompted to enter the radix in the minibuffer.
+
+If RADIX is nil or if the yanked string already has a calc radix prefix, the
+yanked string will be passed on directly to the Calculator buffer without any
+alteration."
+  (interactive "P")
+  (calc-yank-internal radix (if (fboundp 'current-kill)
+                                (current-kill 0 t)
+                              (car kill-ring-yank-pointer))))
+
 ;;; The Calc set- and get-register commands are modified versions of functions
 ;;; in register.el

On Fri, May 27, 2016 at 1:17 PM, Bastian Beischer
<[email-masked]> wrote:
>
> I have customized 'select-enable-primary' to 't' and I'm using it to
> paste the X primary selection with 'mouse-2' often. This invokes
> mouse-yank-primary and that works fine.
>
> It does not work well in calc, though. In calc mouse-2 is bound to
> calc-yank, which takes the thing to be yanked from the kill-ring.
>
> I think it would be appropriate to add a dedicated function
> "calc-yank-mouse" which forwards the data obtained by
> 'gui-selection-value' to 'calc-yank'.
>
> I'm not sure that 'gui-selection-value' is the correct function: What I
> mean is 'a function which respects 'select-enable-primary' and
> 'select-enable-clipboard' and returns the right thing from the
> corresponding X buffer'.
>
> To reproduce:
>
> 1) emacs -Q
> 2) M-x calc
> 3) Select a number in some other X window (xterm for example) with the
>    mouse
> 4) Go back to emacs *calc* buffer and press mouse-2.
>
>
>
> In GNU Emacs 25.0.94.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.20.6)
>  of 2016-05-25 built on beischer-w520
> Repository revision: 897fb6fa49d5ffc85f0a796e7414a43ef05ad096
> Windowing system distributor 'The X.Org Foundation', version 11.0.11803000
> Configured using:
>  'configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib
>  --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games
>  --with-sound=alsa --with-xft --with-modules --with-x-toolkit=gtk3
>  --without-gconf --with-gsettings 'CFLAGS=-march=native -O2 -pipe
>  -fstack-protector-strong' CPPFLAGS=-D_FORTIFY_SOURCE=2
>  LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro'
>
> Configured features:
> XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GSETTINGS NOTIFY
> ACL GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB TOOLKIT_SCROLL_BARS
> GTK3 X11 MODULES
>
> Important settings:
>   value of $LANG: en_US.UTF-8
>   locale-coding-system: utf-8-unix
>
> Major mode: Lisp Interaction
>
> Minor modes in effect:
>   projectile-global-mode: t
>   projectile-mode: t
>   yas-global-mode: t
>   yas-minor-mode: t
>   window-numbering-mode: t
>   company-mode: t
>   diff-auto-refine-mode: t
>   magit-auto-revert-mode: t
>   global-git-commit-mode: t
>   async-bytecomp-package-mode: t
>   flx-ido-mode: t
>   ido-everywhere: t
>   global-srecode-minor-mode: t
>   global-semanticdb-minor-mode: t
>   global-semantic-idle-scheduler-mode: t
>   global-semantic-decoration-mode: t
>   global-semantic-highlight-func-mode: t
>   global-semantic-stickyfunc-mode: t
>   global-semantic-show-parser-state-mode: t
>   semantic-mode: t
>   global-ede-mode: t
>   shell-dirtrack-mode: t
>   show-paren-mode: t
>   global-hi-lock-mode: t
>   hi-lock-mode: t
>   tooltip-mode: t
>   global-eldoc-mode: t
>   electric-indent-mode: t
>   mouse-wheel-mode: t
>   menu-bar-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   font-lock-mode: t
>   blink-cursor-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   column-number-mode: t
>   line-number-mode: t
>   transient-mark-mode: t
>   hs-minor-mode: t
>
> Recent messages:
> .emacs.d/cedet/lisp/cedet/ede/loaddefs.el: Obsolete name arg "lein2" to constructor ede-project-autoload
> .emacs.d/cedet/lisp/cedet/ede/loaddefs.el: Obsolete name arg "linux" to constructor ede-project-autoload
> .emacs.d/cedet/lisp/cedet/ede/loaddefs.el: Obsolete name arg "maven2" to constructor ede-project-autoload
> Parsing  *srecode-map-tmp* (LALR)...done
> Loading /home/beischer/.emacs.d/cedet/cedet-devel-load.el (source)...done
> ad-handle-definition: ‘ido-completing-read’ got redefined
> Loading buff-menu...done
> ad-handle-definition: ‘add-log-current-defun’ got redefined
> Turning on magit-auto-revert-mode...done
> For information about GNU Emacs and the GNU system, type C-h C-a.
>
> Load-path shadows:
> /home/beischer/.emacs.d/cedet/lisp/speedbar/loaddefs hides /home/beischer/.emacs.d/cedet/lisp/cedet/loaddefs
> /home/beischer/.emacs.d/elpa/helm-20160526.248/helm-multi-match hides /home/beischer/.emacs.d/elpa/helm-core-20160526.349/helm-multi-match
> /home/beischer/.emacs.d/elpa/cmake-mode-20160510.1140/cmake-mode hides /usr/share/emacs/site-lisp/cmake-mode
> /usr/share/emacs/site-lisp/various/buff-menu hides /usr/share/emacs/25.0.94/lisp/buff-menu
> /home/beischer/.emacs.d/cedet/lisp/speedbar/loaddefs hides /usr/share/emacs/25.0.94/lisp/loaddefs
> /home/beischer/.emacs.d/elpa/emms-20160304.920/tq hides /usr/share/emacs/25.0.94/lisp/emacs-lisp/tq
>
> Features:
> (shadow sort mail-extr emacsbug sendmail company-oddmuse
> company-keywords company-etags company-gtags company-dabbrev-code
> company-dabbrev company-files company-capf company-cmake company-xcode
> company-clang company-semantic company-eclim company-template
> company-css company-nxml company-bbdb company-edbi edbi sql view jedi
> jedi-core python-environment epc ctable concurrent deferred
> auto-complete popup cmake-project gist gh-gist gh-oauth gh-api logito
> gh-cache pcache gh-auth gh-common gh-url url-http tls gnutls url-auth
> url-gw gh-profile json map timezone org-install tempo url url-proxy
> url-privacy url-expand url-methods url-history url-cookie url-domsuf
> url-util url-parse url-vars mailcap xml-parse doxymacs projectile
> ibuf-ext ibuffer dropdown-list yasnippet cl my-term term disp-table
> ehelp etags-table etags xref project cmake-mode thingatpt rx qt-pro
> pastebin window-numbering company magit-topgit magit-blame magit-stash
> magit-bisect magit-remote magit-commit epa magit-sequence magit esh-var
> esh-io esh-cmd esh-opt esh-ext esh-proc esh-arg esh-groups eshell
> esh-module esh-mode esh-util magit-apply magit-wip magit-log magit-diff
> smerge-mode diff-mode magit-core magit-autorevert autorevert filenotify
> magit-process magit-popup magit-mode derived magit-git crm magit-section
> magit-utils git-commit log-edit message idna rfc822 mml mml-sec epg
> mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
> ietf-drums mailabbrev mail-utils gmm-utils mailheader pcvs-util add-log
> with-editor async-bytecomp easy-mmode async tramp-sh server hide-lines
> buff-menu+ hideshow flx-ido flx ido dired-x dired ede/cpp-root
> srecode/mode semantic/senator srecode/insert srecode/filters
> srecode/args semantic/db-mode f dash s semantic/bovine/c hideif
> semantic/bovine/c-by semantic/lex-spp semantic/idle working fame
> semantic/bovine/gcc semantic/dep semantic/bovine semantic/analyze/refs
> semantic/decorate/include semantic/db-find semantic/db-ref
> semantic/decorate/mode semantic/decorate pulse cedet-devel-load
> cogre/srecode cogre cogre/picture-hack rect picture eieio-opt find-func
> srecode/find srecode/map semantic/edit srecode/srt-mode srecode/template
> srecode/srt-wy semantic/wisent semantic/wisent/wisent srecode/ctxt
> srecode/compile srecode/dictionary srecode/table srecode
> semantic/canned-configs semantic/ia-sb semantic/analyze semantic/sort
> semantic/scope semantic/analyze/fcn semantic/db semantic/ctxt
> semantic/format semantic/tag-ls semantic/find semantic/util-modes
> semantic/util semantic semantic/tag semantic/lex semantic/fw mode-local
> sb-info ede/speedbar ede/files ede ede/detect ede/base ede/auto
> ede/source eieio-compat eieio-base eieio-speedbar speedbar sb-image
> ezimage dframe eieio-custom wid-edit cedet cedet-compat inversion
> cedet-remove-builtin cc-mode cc-fonts cc-guess cc-menus cc-cmds
> cc-styles cc-align cc-engine cc-vars cc-defs flymake finder-inf tex-site
> info package epg-config seq vc-cvs tramp tramp-compat auth-source cl-seq
> eieio byte-opt bytecomp byte-compile cl-extra cconv eieio-core cl-macs
> gv gnus-util mm-util help-fns help-mode easymenu mail-prsvr
> password-cache tramp-loaddefs trampver ucs-normalize shell pcomplete
> format-spec advice edmacro kmacro cl-loaddefs pcase cl-lib emacs-x-theme
> paren grep compile comint ansi-color ring linum hi-lock cus-start
> cus-load time-date mule-util tooltip eldoc electric uniquify ediff-hook
> vc-hooks lisp-float-type mwheel x-win term/common-win x-dnd tool-bar dnd
> fontset image regexp-opt fringe tabulated-list newcomment elisp-mode
> lisp-mode prog-mode register page menu-bar rfn-eshadow timer select
> scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame
> cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai
> tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian
> slovak czech european ethiopic indian cyrillic chinese charscript
> case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer
> cl-preloaded nadvice loaddefs button faces cus-face macroexp files
> text-properties overlay sha1 md5 base64 format env code-pages mule
> custom widget hashtable-print-readable backquote dbusbind inotify
> dynamic-setting system-font-setting font-render-setting move-toolbar gtk
> x-toolkit x multi-tty make-network-process emacs)
>
> Memory information:
> ((conses 16 614175 16718)
>  (symbols 48 51346 53)
>  (miscs 40 87 180)
>  (strings 32 120506 20978)
>  (string-bytes 1 3736110)
>  (vectors 16 72174)
>  (vector-slots 8 1281781 10649)
>  (floats 8 1544 163)
>  (intervals 56 402 0)
>  (buffers 976 14)
>  (heap 1024 50297 2436))

-- 
Bastian Beischer
RWTH Aachen University of Technology

@RWTH Aachen
Office: 28 C 203
Phone: +49-241-80-27205
E-mail: [email-masked]
Address: I. Physikalisches Institut B, Sommerfeldstr. 14, D-52074 Aachen

@CERN
Office: Bdg 32-4-B12
Phone: +41-22-76-75750
E-mail: [email-masked]
Address: CERN, CH-1211 Geneve 23