unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: "Drew Adams" <drew.adams@oracle.com>
To: "'martin rudalics'" <rudalics@gmx.at>
Cc: 8856@debbugs.gnu.org
Subject: bug#8856: 24.0.50; regression: special-display-frame is no longer dedicated
Date: Thu, 23 Jun 2011 09:45:29 -0700	[thread overview]
Message-ID: <5450FF6E1BAC409AB30733F9ABE51C31@us.oracle.com> (raw)
In-Reply-To: <31769215C0FF4E1E89F9F641C5843E91@us.oracle.com>

[-- Attachment #1: Type: text/plain, Size: 4298 bytes --]

> I comment out the two lines
> ;; (load-file "c:/drews-lisp-20/hexrgb.el")
> ;; (load-file "c:/drews-lisp-20/fit-frame.el")
> at the beginning of the file.  I hope they are not needed.

Yes, that was an oversight.  They are not needed at all.

>  > Note: In the file, both of these two lines are necessary, 
>  > to cause the error:
>  > (add-hook 'post-command-hook '1on1-fit-minibuffer-frame)
>  > (setq w32-grab-focus-on-raise    nil)
> 
> Both are in here.

Yes, they are needed.

> With the `post-command-hook' active, focus remains always within the
> Minibuffer frame at the bottom of my screen, whatever silly I 
> type.  The Completions frame is never selected.  So lets hope
> this got fixed.
> 
> I attach a copy of window.el as usual.  If you think that 
> hexrgb and/or fit-frame are needed for showing the bug,
> please tell me so.

(No, those files are not needed.  You can remove those two lines.)

Testing with the latest window.el you just sent, here are the results:


THE GOOD NEWS:

With the last setup we both tried, no bug!  That is: 
runemacs.exe -Q --debug-init -l "window-2011-06-23a-MARTIN.el" -l
"throw-three.el" -f "1on1-emacs"


THE BAD NEWS:

So I pared down again.  The bug happens if you make just this change in the
definition of `1on1-emacs':

Change these lines:

(if 1on1-minibuffer-frame
    (modify-frame-parameters
      1on1-minibuffer-frame
      1on1-minibuffer-frame-alist)
 (setq 1on1-minibuffer-frame
       (make-frame 1on1-minibuffer-frame-alist)))

To these, which is really what I use:

(if 1on1-minibuffer-frame
    (modify-frame-parameters
      1on1-minibuffer-frame
      1on1-minibuffer-frame-alist)
  (setq 1on1-minibuffer-frame
        (let ((after-make-frame-functions  nil))
          (make-frame 1on1-minibuffer-frame-alist))))

IOW, the difference is that `after-make-frame-functions' is bound to nil when
`make-frame' is called.  I do that to inhibit my `fit-frame' from doing
anything.  I have `fit-frame' on `after-make-frame-functions'.

I attached the file - just do as before, using this instead of throw-three.el.

I can try removing just `fit-frame' from that hook and then restoring it.  But I
think I shouldn't have to.  I think that correct behavior should not depend on
`after-make-frame-functions'.  Don't you agree?

Can you please take a look and see why and whether it is necessary that a user
_not_ bind `after-make-frame-functions' to nil here?

Why should `after-make-frame-functions' have any effect on whether keyboard
input for *Completions* gets properly redirected to the minibuffer frame?  You
don't use `after-make-frame-functions' in your code, do you?

If so, that I think is probably a bad idea.  Such hooks should be only for
additional, user etc. things, not for necessary code for vanilla Emacs to work
normally.

Anyway, please let me know what you think.  Give it a try with that `let'
binding (just use the attached file), to confirm that you at least see the same
problem as I.  We can then worry about what to do to fix or work around the
problem.

Again, the problem happens only when the *Completions* is first created.  What
happens on MS Windows is that whenever a frame is created it gets selected (by
the OS/window mgr - there is no way around this).

And for some reason, I guess because of emptying `after-make-frame-functions',
that Windows-frame-selection-on-creation is now also selecting the
window/buffer, and in such a way that keyboard input is not being correctly
redirected to the minibuffer frame.

And as before (since you made some changes a few days ago), things do work
correctly once the *Completions* frame has been created.  If that frame is
already showing and I repeat the recipe (M-x etc.) there is no problem.

And that is true regardless of which frame is selected when I start with M-x:
the *scratch* frame, the minibuffer frame, or even the *Completions* frame.
When I hit M-x, the input is always correctly redirected to the minibuffer
frame, so there is no error saying that *Completions* is read-only.  (Again,
this is when *Completions* was already showing.)

I think (and hope) we are almost there.  Something seems to be preventing the
input-focus redirection just after the *Completions* frame is created, when
`after-make-frame-functions' is nil.

Thx - Drew

[-- Attachment #2: throw-fit-1.el --]
[-- Type: application/octet-stream, Size: 7813 bytes --]

(setq debug-on-error t)

;;; Minibuffer frame: ********************************
;;;
(defvar 1on1-minibuffer-frame nil "")

(defcustom 1on1-minibuffer-frame-alist
  (list
   (assq 'foreground-color minibuffer-frame-alist)
   (or (assq 'background-color minibuffer-frame-alist)
       (cons 'background-color "LightBlue"))
   (assq 'font minibuffer-frame-alist)
   (assq 'mouse-color minibuffer-frame-alist)
   (assq 'cursor-color minibuffer-frame-alist)
   (or (assq 'menu-bar-lines minibuffer-frame-alist)
       (cons 'menu-bar-lines 0))
   (or (assq 'left minibuffer-frame-alist)
       (cons 'left 0))
   (or (assq 'height minibuffer-frame-alist)
       (cons 'height 2))
   (or (assq 'icon-type minibuffer-frame-alist)
       (cons 'icon-type (< emacs-major-version 21))) ; `t' for Emacs 21 too?
   (or (assq 'minibuffer minibuffer-frame-alist)
       (cons 'minibuffer 'only))
   (or (assq 'user-position minibuffer-frame-alist)
       (cons 'user-position t))
   (or (assq 'vertical-scroll-bars minibuffer-frame-alist) ;  No scroll bar.
       (cons 'vertical-scroll-bars nil))
   (or (assq 'name minibuffer-frame-alist)
       (cons 'name "Emacs Minibuffer")))
  ""
  :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") (sexp :tag "Value")))
  :group 'One-On-One)

;;; *Completions* frame: ********************************
(defcustom 1on1-default-frame-alist
  (list
   (assq 'foreground-color default-frame-alist)
   (or (assq 'background-color default-frame-alist)
       (cons 'background-color "LightBlue"))
   (assq 'font default-frame-alist)
   (assq 'mouse-color default-frame-alist)
   (assq 'cursor-color default-frame-alist)
   (assq 'cursor-type default-frame-alist)
   (or (assq 'menu-bar-lines default-frame-alist)
       (cons 'menu-bar-lines 1))
   (or (assq 'top default-frame-alist)
       (cons 'top 0))
   (or (assq 'left default-frame-alist)
       (cons 'left 0))
   (or (assq 'width default-frame-alist)
       (cons 'width 80))
   (or (assq 'height default-frame-alist)
       (cons 'height 35))
   (or (assq 'minibuffer default-frame-alist)
       (cons 'minibuffer nil))
   (or (assq 'user-position default-frame-alist)
       (cons 'user-position t))
   (or (assq 'vertical-scroll-bars default-frame-alist)
       (cons 'vertical-scroll-bars 'right))
   (or (assq 'icon-type default-frame-alist)
       (cons 'icon-type (< emacs-major-version 21))) ; `t' for Emacs 21 too?
   (or (assq 'tool-bar-lines default-frame-alist)
       (cons 'tool-bar-lines 1))        ; Emacs 21+
   (if (cdr (assq 'left-fringe default-frame-alist))
       (assq 'left-fringe default-frame-alist)
     (cons 'left-fringe 0))             ; Emacs 21+
   (if (cdr (assq 'right-fringe default-frame-alist))
       (assq 'right-fringe default-frame-alist)
     (cons 'right-fringe 0))            ; Emacs 21+
   (or (assq 'fringe default-frame-alist)
       (cons 'fringe 0)))               ; Emacs 21, but not 21.3.50 - REMOVE after 22.x
  ""
  :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") (sexp :tag "Value")))
  :group 'frames)

;;; Special-display frames
(defcustom 1on1-special-display-frame-alist
  (list
   (assq 'font special-display-frame-alist)
   (or (assq 'width special-display-frame-alist)
       (cons 'width 80))
   (or (assq 'height special-display-frame-alist)
       (cons 'height 20))
   (assq 'mouse-color special-display-frame-alist)
   (assq 'cursor-color special-display-frame-alist)
   (or (assq 'menu-bar-lines special-display-frame-alist)
       (cons 'menu-bar-lines 1))
   (assq 'foreground-color special-display-frame-alist)
   (or (assq 'background-color special-display-frame-alist)
       (cons 'background-color "LightSteelBlue"))
   (or (assq 'top special-display-frame-alist)
       (cons 'top 0))
   (or (assq 'left special-display-frame-alist)
       (cons 'left 0))
   (or (assq 'unsplittable special-display-frame-alist)
       (cons 'unsplittable t))
   (or (assq 'user-position special-display-frame-alist)
       (cons 'user-position t))
   (or (assq 'vertical-scroll-bars special-display-frame-alist)
       (cons 'vertical-scroll-bars 'right)))
  ""
  :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") (sexp :tag "Value")))
  :group 'frames)

(defun 1on1-emacs ()
  ""
  (interactive)
  (unless (if (fboundp 'display-graphic-p) (display-graphic-p) window-system)
    (error "Use `1on1-emacs' only with a graphics display, not with a text terminal"))
  (setq default-frame-alist (append 1on1-default-frame-alist default-frame-alist)
        special-display-frame-alist (append 1on1-special-display-frame-alist
                                            special-display-frame-alist))
  (add-to-list                          ; *Help* frame
   'special-display-buffer-names
   (list "*Help*" '1on1-display-*Help*-frame
         (list (cons 'background-color "Thistle")
               '(height . 40))))
  (add-to-list                          ; *Completions* frame
   'special-display-buffer-names
   `("*Completions*" 1on1-display-*Completions*-frame
     ((background-color . "LavenderBlush2")
      (menu-bar-lines . 0) (tool-bar-lines . 0)
      (width . 100))))
  (setq pop-up-frames  t)
  ;; Minibuffer frame
  (setq minibuffer-frame-alist (append 1on1-minibuffer-frame-alist
                                       minibuffer-frame-alist))

  (if 1on1-minibuffer-frame
      (modify-frame-parameters 1on1-minibuffer-frame 1on1-minibuffer-frame-alist)
    (setq 1on1-minibuffer-frame
          (let ((after-make-frame-functions  nil)) ; E.g. inhibit `fit-frame'.
            (make-frame 1on1-minibuffer-frame-alist))))
;;   (if 1on1-minibuffer-frame
;;       (modify-frame-parameters 1on1-minibuffer-frame 1on1-minibuffer-frame-alist)
;;     (setq 1on1-minibuffer-frame
;;           (make-frame 1on1-minibuffer-frame-alist)))
  (set-frame-width 1on1-minibuffer-frame 150)
  (modify-frame-parameters 1on1-minibuffer-frame `((top ,@ -50)))
  (setq minibuffer-auto-raise t)

  ;; Hooks.
  ;; @@@
  (add-hook 'post-command-hook '1on1-fit-minibuffer-frame)
  (setq w32-grab-focus-on-raise    nil)
  ;; @@@
  )
     
(defun 1on1-display-*Help*-frame (buf &optional args)
  ""
  (let (return-window)
    (setq return-window (select-window (funcall special-display-function buf args)))
    (raise-frame)
    return-window))

(defun 1on1-display-*Completions*-frame (buf &optional args)
  ""
  (let (return-window)
    (setq return-window (select-window (funcall special-display-function buf args)))
    (raise-frame)
    (when (boundp '1on1-minibuffer-frame)
      (redirect-frame-focus (selected-frame) 1on1-minibuffer-frame))
    return-window))

;; @@@
(defun 1on1-fit-minibuffer-frame ()
  ""
  (interactive)
  (when (and (active-minibuffer-window)
             (save-selected-window
               (select-window (minibuffer-window))
               (one-window-p nil 'selected-frame)))
    (let* ((frame         (save-selected-window
                            (select-window (minibuffer-window)) (selected-frame)))
           (frame-height  (frame-height frame)))
      (cond
        ((eq last-command '1on1-fit-minibuffer-frame)
         (set-frame-height frame (1+ (frame-height frame)))
         (modify-frame-parameters 1on1-minibuffer-frame `((top ,@ -50)))
         (condition-case nil (scroll-down (frame-height frame)) (error nil)))
        (t
         (let ((window-min-height  2))
           (modify-frame-parameters 1on1-minibuffer-frame `((top ,@ -50)))
           (condition-case nil (scroll-down (frame-height frame)) (error nil))))))))

;; @@@

\f
(load-file "c:/drews-lisp-20/window-2011-06-23a-MARTIN.el")

  reply	other threads:[~2011-06-23 16:45 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-13 16:08 bug#8851: 24.0.50; regression: special-display-frame is no longer dedicated Drew Adams
2011-06-13 18:00 ` martin rudalics
2011-06-13 18:41   ` Drew Adams
2011-06-14  9:15     ` martin rudalics
2011-06-14 20:36       ` Drew Adams
     [not found]         ` <4DFB6BBF.3080504@gmx.at>
2011-06-17 15:51           ` Drew Adams
2011-06-17 16:22             ` bug#8856: " martin rudalics
2011-06-17 17:48               ` Drew Adams
2011-06-19 17:29                 ` Drew Adams
2011-06-20  3:04                   ` Stefan Monnier
2011-06-17 17:48             ` bug#8856: " Drew Adams
2011-06-19 13:26               ` martin rudalics
2011-06-19 14:31                 ` bug#8856: 24.0.50;regression: `special-display-frame' broken Drew Adams
2011-06-19 18:50                   ` Chong Yidong
2011-06-19 18:54                     ` Drew Adams
     [not found]               ` <4DFE09A7.10500@gmx.at>
2011-06-19 14:43                 ` bug#8856: 24.0.50; regression: special-display-frame is no longer dedicated Drew Adams
2011-06-19 17:26                   ` Drew Adams
2011-06-19 18:40                     ` martin rudalics
2011-06-19 19:34                       ` bug#8856: 24.0.50; regression: `special-display-popup-frame' broken Drew Adams
2011-06-19 19:52                         ` Drew Adams
2011-06-20  9:46                     ` bug#8856: 24.0.50; regression: special-display-frame is no longer dedicated martin rudalics
2011-06-20 13:01                       ` Drew Adams
     [not found]                         ` <4E00C54C.5080108@gmx.at>
2011-06-21 18:10                           ` Drew Adams
2011-06-22  0:13                             ` Drew Adams
2011-06-22  0:14                             ` Drew Adams
2011-06-22  0:15                             ` Drew Adams
2011-06-23 16:45                               ` Drew Adams [this message]
     [not found]                               ` <4E033CBA.1050700@gmx.at>
     [not found]                                 ` <DB9EDF1C454F42A0BC437F0E0AEE6CA2@us.oracle.com>
     [not found]                                   ` <4E037708.2000205@gmx.at>
2011-06-23 22:06                                     ` Drew Adams
2011-06-24  8:53                                       ` martin rudalics
2011-06-24 21:21                                         ` Drew Adams
2011-06-25 14:15                                           ` martin rudalics
2011-06-25 14:52                                             ` Drew Adams
     [not found]                                               ` <8A3D5626004B4 945A624B69463A0B849@us.oracle.com>
2011-06-25 15:04                                               ` Drew Adams
2011-06-25 15:57                                                 ` martin rudalics
2011-06-25 16:15                                                   ` Drew Adams
2011-06-25 17:00                                                     ` martin rudalics
2011-06-25 17:48                                                       ` Drew Adams
2011-06-26 13:50                                                         ` martin rudalics
2011-06-26 14:56                                                           ` Drew Adams
     [not found]                                                             ` <0721F495F4A441529FCB91280D284E42@us.oracle.com! >
2011-06-26 15:15                                                             ` Drew Adams
2011-06-26 15:54                                                               ` martin rudalics
2011-06-26 16:06                                                                 ` Drew Adams

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=5450FF6E1BAC409AB30733F9ABE51C31@us.oracle.com \
    --to=drew.adams@oracle.com \
    --cc=8856@debbugs.gnu.org \
    --cc=rudalics@gmx.at \
    /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).