From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: Context menus and mouse-3 Date: Mon, 12 Jul 2021 18:32:17 -0400 Message-ID: References: <20200914061111.3trmuzhdvv7nwdcc@Ergus> <87y2acv2tw.fsf@mail.linkov.net> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="29386"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: Richard Stallman , spacibba@aol.com, philipk@posteo.net, emacs-devel@gnu.org, arthur.miller@live.com, dgutov@yandex.ru, ghe@sdf.org, drew.adams@oracle.com To: Juri Linkov Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Jul 13 00:33:08 2021 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m34U8-0007R4-6X for ged-emacs-devel@m.gmane-mx.org; Tue, 13 Jul 2021 00:33:08 +0200 Original-Received: from localhost ([::1]:34630 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1m34U6-0000Qv-5U for ged-emacs-devel@m.gmane-mx.org; Mon, 12 Jul 2021 18:33:06 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:56878) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m34TU-0007p5-AO for emacs-devel@gnu.org; Mon, 12 Jul 2021 18:32:28 -0400 Original-Received: from mailscanner.iro.umontreal.ca ([132.204.25.50]:26247) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1m34TQ-00084r-Kw; Mon, 12 Jul 2021 18:32:26 -0400 Original-Received: from pmg1.iro.umontreal.ca (localhost.localdomain [127.0.0.1]) by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id 5A9B61001F4; Mon, 12 Jul 2021 18:32:20 -0400 (EDT) Original-Received: from mail01.iro.umontreal.ca (unknown [172.31.2.1]) by pmg1.iro.umontreal.ca (Proxmox) with ESMTP id EF420100040; Mon, 12 Jul 2021 18:32:18 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=iro.umontreal.ca; s=mail; t=1626129138; bh=+QzsJTJ2dN9sgv6OLNBZYORRxUAo5JBp1c544fEMVxs=; h=From:To:Cc:Subject:References:Date:In-Reply-To:From; b=gNvH3lzeNZqQoCzKzWO47hV3liv+iEC8PuXDMn+Re62zRsPtTTI2RUi0w8TQ1tkIG DElOiK/g8wvSXLndzehR8/2OWCMvPn4X/f5nN/ac188QNFePFogFuqSEY4q+NuB8Nf OnKpZNP5X7Qsg4uRqKnyCP6iaJeCdGgVIOabyP1vcRFUAn2XSyK7fXBJvpzMD23qq/ pDHTXRVllu7qxyvrd9Xvo3OhE0j3UGD/gR7FF9DEE3bsB6AIpBWSvezH9mOXqMdzeC u7F7IZQeAAsBbPVZ5Veq9YdF/yoHTMNl7w4N7koSS6L4Q6qk7xTK1RJtofiDuJA4j1 fYfOSifa0aMxA== Original-Received: from alfajor (unknown [216.154.29.138]) by mail01.iro.umontreal.ca (Postfix) with ESMTPSA id 88CE41202DA; Mon, 12 Jul 2021 18:32:18 -0400 (EDT) In-Reply-To: <87y2acv2tw.fsf@mail.linkov.net> (Juri Linkov's message of "Mon, 12 Jul 2021 02:38:19 +0300") Received-SPF: pass client-ip=132.204.25.50; envelope-from=monnier@iro.umontreal.ca; helo=mailscanner.iro.umontreal.ca X-Spam_score_int: -42 X-Spam_score: -4.3 X-Spam_bar: ---- X-Spam_report: (-4.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:271189 Archived-At: Juri Linkov [2021-07-12 02:38:19] wrote: > This is a much needed feature and it would nice to finish it one way or another. > I tried to use timers, and the result works well in all test cases: [...] > + (setq mouse--down-3-timer > + (run-with-timer > + (/ (abs mouse-3-down-context-menu) 1000.0) nil > + (lambda () > + (setq mouse--down-3-timer t) > + (unless (eq (posn-window (event-end event)) (selected-window)) > + (select-window (posn-window (event-end event)))) > + (mouse-context-menu event)))) [...] > (defun mouse-context-menu (event) > "Show a context menu for the current buffer." > (interactive "@e") > (popup-menu (mouse-context-menu-map) event)) I'm a bit busy with other things these days, but just looking at the above code, one thing I see as a potential problem with this code is that the context menu commands won't be run "the normal way": the undo-boundary won't be applied as usual, post/pre-command-hook won't be run as usual, etc... > The global binding of [menu-bar] is defined in menu-bar.el, > so the same way [context-menu] could be defined globally Agreed, and I think it would address the above problem. I.e. do something like (defun mouse-context-menu (event) (push `(context-menu . ,(cdr event)) unread-command-events)) BTW, the other worry with your code is that if you use an input device which can fail to pair the down/up mouse-3 events, you might end up failing to cancel the timer code (that can also happen when the users set a binding for `drag-mouse-3`, I think), so maybe you should arrange for the down event to register a `pre-command-hook` that cancels the timer. In terms of aesthetics, it would be good to arrange the code such that `mouse--click-3-maybe-context-menu` doesn't need to duplicate/mimic the tests performed in `mouse-maybe-context-menu`. Maybe have `mouse-maybe-context-menu` set some var telling `mouse--click-3-maybe-context-menu` when the next `mouse-3` should be dropped? Stefan PS: FWIW, the "proof of concept" code I have in my local Emacs is: (global-set-key [down-mouse-3] #'mouse-maybe-context-menu) (defun mouse-maybe-context-menu (event) "Bring up a context menu for a long click." (interactive "@e") (if (let* ((track-mouse t) (time (/ mouse-long-click-time 1000.0)) (result (sit-for time))) (message "Maybe-context-menu: %S %S" time result) result) (push (cons 'context-menu (cdr event)) unread-command-events))) I think `sit-for` can be made to work OK, but my proof-of-concept isn't good enough. I think the main issue is that it doesn't swallow the mouse-3 click, but I haven't really looked into it.