unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Masatake YAMATO <yamato@redhat.com>
To: monnier@IRO.UMontreal.CA
Cc: emacs-devel@gnu.org
Subject: Re: [patch v3] showing menu bar temporarily when f10 is pressed
Date: Wed, 18 Jul 2012 20:29:01 +0900 (JST)	[thread overview]
Message-ID: <20120718.202901.2035363502190339372.yamato@redhat.com> (raw)
In-Reply-To: <20120620.151738.1783513864733342718.yamato@redhat.com>

Hi,

If no objection, please, install this patch to the official source tree.
I've attached the latest version.

(I'm using this patch on gnome-shell, which provides generic(?) full-screen 
 mode. The full-screen mode with this patch is quite nice.)

Masatake YAMATO

>>> +	  (unless visible
>>> +	    (menu-bar-mode 1))
>> 
>> Here we have a problem: if you have several frames, some of which have
>> a menu-bar and some don't, this will add a menu-bar to all of them, and
>> then (menu-bar-mode -1) will remove it from all the frames.
> 
> Thank you for reviewing.
> I've revised my patch to handle the case you pointed out. 
> In the new patch, I deal with only frame local parameter.
> I don't touch the minor mode.
> I have still one un solved(TODO) item. 
> 
>> Why do you need the menu-bar?  Why not pop up the menu usually bound to
>> C-mouse-3?
> 
> To be honest, I didn't know that.
> I've just tried C-mouse-3; and found some advantages of C-mouse-3
> comparing with f10 for KEYBOARD USER. 
> 
> 1. With C-mouse-3, the menu is pop up where mouse pointer is.
>    With f10, the menu is appeared at the top of frame.
>    With f10, the position is predictable.
> 
>    Following the cases user may lost the mouse pointer:
> 
>    * using large display,
>    * editing text with keyboard long time, and/or
>    * turning on mouse-avoidance-mode.
>    
>    In addition it seems that emacs hides the mouse pointer 
>    while the user editing text continuously. 
> 
>    So with C-moues-3, the user have to search the menu
>    popup'ed. Time taking searching is very short but
>    some user may feel frustration when the menu appeared
>    on somewhere far away from (point). 
> 
>    In other hand, with f10, the user can predict the 
>    place where menu appears. No mental overload.
> 
> 2. With C-mouse-3, the contents of menu is chosen based
>    on the window where the mouse pointer is.
> 
>    Consider a frame is splited into two windows.
>    Each window holds different buffer. And different
>    major modes are activated on buffers:
> 
>    Window A -> Buffer B -> Major mode C.
>    Window D -> Buffer D -> Major mode E.
> 
>    Consider the following situation:
>       You are editing text on buffer B, and
>       Mouse pointer is at D.
> 
>    When C-mouse-3 is operated in this situation, a popup menu(P0)
>    which includes a menu entry for major mode E will be appeared. But
>    user may exepct a popup menu(P1) which includes a menu entry for
>    major mode C is appeared.
> 
>    To show P1 in this situation, the user must move the
>    mouse pointer to somewhere Window A.
>    It doesn't take long time to move the mouse pointer to 
>    Window A. some user may feel frustration. 
> 
> Moving the mouse cursor to (point) automatically before
> C-mouse-3 may convers two disadvantage of C-mouse-3 with
> keyboard operation. This is interesting idea, However, I 
> feel extending [f10] is natural.
> 
> Masatake YAMATO

=== modified file 'lisp/ChangeLog'
--- lisp/ChangeLog	2012-06-24 15:06:24 +0000
+++ lisp/ChangeLog	2012-07-04 17:42:24 +0000
@@ -1,3 +1,15 @@
+2012-06-19  Masatake YAMATO  <yamato@redhat.com>
+
+	* term/x-win.el (x-menu-bar-temorary-visibility): New custom var.
+	(x-menu-bar-open): Show menu bar temporarily if `x-menu-bar-temorary-visibility'.
+	(x-accelerate-menu-with-temporary-visible-menu-bar): New function.
+
 2012-06-24  Chong Yidong  <cyd@gnu.org>
 
 	* xml.el (xml-parse-tag): Correctly handle comment embedded in

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2012-06-25 10:28:47 +0000
+++ src/ChangeLog	2012-06-25 12:38:35 +0000
@@ -1,3 +1,11 @@
+2012-06-19  Masatake YAMATO  <yamato@redhat.com>
+
+	* xmenu.c (popup_deactivate_callback): Run Qdeactivate_menubar_hook.
+
+	* keyboard.c (Qdeactivate_menubar_hook): Define a new hook.
+
+	* keyboard.h (Qdeactivate_menubar_hook): Declare the new hook.
+
 2012-06-25  Andreas Schwab  <schwab@linux-m68k.org>
 
 	* keyboard.c (menu_bar_items, menu_bar_item, read_key_sequence):

=== modified file 'lisp/term/x-win.el'
--- lisp/term/x-win.el	2012-04-27 05:40:46 +0000
+++ lisp/term/x-win.el	2012-06-20 07:23:03 +0000
@@ -1,4 +1,4 @@
-;;; x-win.el --- parse relevant switches and set up for X  -*-coding: iso-2022-7bit;-*-
+;;; x-win.el --- parse relevant switches and set up for X  -*-coding: iso-2022-7bit; lexical-binding: t; -*-
 
 ;; Copyright (C) 1993-1994, 2001-2012 Free Software Foundation, Inc.
 
@@ -1190,6 +1190,15 @@
 		      (const TEXT)))
   :group 'killing)
 
+(defcustom x-menu-bar-temorary-visibility t
+  "Control whether use menu bar or `tmm-menubar' when `x-menu-bar-open' is invoked.
+Non-nil means showing menu bar temporarily even if `menu-bar-mode' is turned off.
+If nil, the behavior is changed whether `menu-bar-mode' is on or off. See `x-menu-bar-open'
+for more detail."
+  :type 'boolean
+  :group 'x
+  :version "24.2")
+
 ;; Get a selection value of type TYPE by calling x-get-selection with
 ;; an appropriate DATA-TYPE argument decided by `x-select-request-type'.
 ;; The return value is already decoded.  If x-get-selection causes an
@@ -1304,12 +1313,38 @@
 
 (declare-function accelerate-menu "xmenu.c" (&optional frame) t)
 
+(defun x-accelerate-menu-with-temporary-visible-menu-bar (frame)
+  "Do `accelerate-menu' with temporarily visible menu bar of FRAME."
+  (let ((old-menu-bar-lines (frame-parameter frame 'menu-bar-lines))
+	(old-frame (or frame (selected-frame)))
+	(old-menu-bar-mode menu-bar-mode))
+    (if (menu-bar-positive-p old-menu-bar-lines)
+	(accelerate-menu frame)
+      (letrec ((hide (lambda ()
+		       (remove-hook 'deactivate-menubar-hook hide)
+		       (when (or (frame-live-p old-frame)
+				 ;; Handle the case that if menu-bar-mode is
+				 ;; turned on/off with choosing a menu item for controling the mode.
+				 (or (eq old-menu-bar-mode menu-bar-mode)
+				     (not menu-bar-mode)))
+			 (set-frame-parameter old-frame 
+					      'menu-bar-lines old-menu-bar-lines)))))
+	(set-frame-parameter old-frame 'menu-bar-lines 1)
+	(prog1
+	    (accelerate-menu frame)
+	  (add-hook 'deactivate-menubar-hook hide))))))
+
 (defun x-menu-bar-open (&optional frame)
-  "Open the menu bar if `menu-bar-mode' is on, otherwise call `tmm-menubar'."
+  "Open the menu bar if `menu-bar-mode' is on or `x-menu-bar-temorary-visibility' is non-nil, otherwise call `tmm-menubar'."
   (interactive "i")
-  (if (and menu-bar-mode
-	   (fboundp 'accelerate-menu))
-      (accelerate-menu frame)
+  (if (fboundp 'accelerate-menu)
+      (cond
+       (x-menu-bar-temorary-visibility
+	(x-accelerate-menu-with-temporary-visible-menu-bar frame))
+       (menu-bar-mode
+	(accelerate-menu frame))
+       (t
+	(tmm-menubar)))
     (tmm-menubar)))
 
 \f

=== modified file 'src/keyboard.c'
--- src/keyboard.c	2012-06-25 10:28:47 +0000
+++ src/keyboard.c	2012-06-25 12:37:36 +0000
@@ -257,6 +257,7 @@
 static Lisp_Object Qdeactivate_mark;
 
 Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook;
+Lisp_Object Qdeactivate_menubar_hook;
 
 static Lisp_Object Qecho_area_clear_hook;
 
@@ -11527,6 +11528,7 @@
 
   DEFSYM (Qrecompute_lucid_menubar, "recompute-lucid-menubar");
   DEFSYM (Qactivate_menubar_hook, "activate-menubar-hook");
+  DEFSYM (Qdeactivate_menubar_hook, "deactivate-menubar-hook");
 
   DEFSYM (Qpolling_period, "polling-period");
 

=== modified file 'src/keyboard.h'
--- src/keyboard.h	2012-02-10 18:58:48 +0000
+++ src/keyboard.h	2012-06-19 17:08:30 +0000
@@ -212,6 +212,7 @@
 extern Lisp_Object internal_last_event_frame;
 \f
 extern Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook;
+extern Lisp_Object Qdeactivate_menubar_hook;
 
 /* This holds a Lisp vector that holds the properties of a single
    menu item while decoding it in parse_menu_item.

=== modified file 'src/xmenu.c'
--- src/xmenu.c	2012-06-25 04:05:48 +0000
+++ src/xmenu.c	2012-06-25 12:37:36 +0000
@@ -684,12 +684,14 @@
 static void
 popup_deactivate_callback (GtkWidget *widget, gpointer client_data)
 {
+  safe_run_hooks (Qdeactivate_menubar_hook);
   popup_activated_flag = 0;
 }
 #else
 static void
 popup_deactivate_callback (Widget widget, LWLIB_ID id, XtPointer client_data)
 {
+  safe_run_hooks (Qdeactivate_menubar_hook);
   popup_activated_flag = 0;
 }
 #endif




  reply	other threads:[~2012-07-18 11:29 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-19 18:41 [patch] showing menu bar temporarily when f10 is pressed Masatake YAMATO
2012-06-19 20:31 ` Lluís
2012-06-19 21:42 ` Stefan Monnier
2012-06-20  6:17   ` [patch v2] " Masatake YAMATO
2012-07-18 11:29     ` Masatake YAMATO [this message]
2012-07-19  6:54       ` [patch v3] " Stefan Monnier
2012-07-19  8:32         ` Where the menu should be appeared when C-mouse-3 is triggered (Was: [patch v3] showing menu bar temporarily when f10 is pressed) Masatake YAMATO
2012-07-19  9:07           ` Where the menu should be appeared when C-mouse-3 is triggered Stefan Monnier
2012-07-20  4:55             ` Masatake YAMATO
2012-07-20 11:38               ` Stefan Monnier
2012-07-20 11:56                 ` Masatake YAMATO
2012-07-28  9:31                   ` Masatake YAMATO
2012-08-09 11:13                     ` Masatake YAMATO
2012-08-10 12:44                       ` Stefan Monnier
2012-08-10 13:21                         ` Drew Adams
2012-08-10 13:52                         ` Masatake YAMATO
2012-08-10 14:47                         ` Stefan Monnier
2012-07-20 12:48                 ` Masatake YAMATO

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120718.202901.2035363502190339372.yamato@redhat.com \
    --to=yamato@redhat.com \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@IRO.UMontreal.CA \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).