1 ;;; xwem-minibuffer.el --- XWEM minibuffer support.
3 ;; Copyright (C) 2003-2005 by XWEM Org.
5 ;; Author: Zajcev Evgeny <zevlg@yandex.ru>
6 ;; Created: Thu Dec 4 15:13:12 MSK 2003
7 ;; Keywords: xwem, xlib
8 ;; X-CVS: $Id: xwem-minibuffer.el,v 1.12 2005-04-04 19:54:13 lg Exp $
10 ;; This file is part of XWEM.
12 ;; XWEM is free software; you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
17 ;; XWEM is distributed in the hope that it will be useful, but WITHOUT
18 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
20 ;; License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING. If not, write to the Free
24 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
27 ;;; Synched up with: Not in FSF
31 ;; XWEM minibuffer stuff. XWEM minibuffer is Emacs frame with
32 ;; 'minibuffer property set to 'only. It is used for various thigs,
33 ;; such as messages displaying, system tray, etc.
39 (require 'xwem-manage)
42 (defvar x-emacs-application-class nil))
45 (defgroup xwem-minibuffer nil
46 "Group to customize XWEM minibuffer."
47 :prefix "xwem-minibuffer-"
50 (defcustom xwem-minibuffer-name "xwem-minibuffer"
51 "*Minibuffer name to be used by XWEM."
53 :group 'xwem-minibuffer)
55 (defcustom xwem-minibuffer-bgcol "gray80"
56 "*Background color to be used in `xwem-minib-frame'."
58 :set (lambda (sym val)
60 (when (and xwem-minibuffer
61 (X-Win-p (xwem-minib-xwin xwem-minibuffer)))
63 (xwem-dpy) (xwem-minib-xwin xwem-minibuffer)
64 (XAllocColor (xwem-dpy) (XDefaultColormap (xwem-dpy))
65 (xwem-make-color xwem-minibuffer-bgcol)))
66 (XClearArea (xwem-dpy) (xwem-minib-xwin xwem-minibuffer) 0 0
67 (X-Geom-width (xwem-minib-xgeom xwem-minibuffer))
68 (X-Geom-height (xwem-minib-xgeom xwem-minibuffer)) nil)))
69 :initialize 'custom-initialize-default
70 :group 'xwem-minibuffer)
72 (defcustom xwem-minibuffer-font (face-font-name 'default)
73 "*Font to be used in `xwem-minib-frame'. May be nil or string."
74 :type '(restricted-sexp :match-alternatives ('nil try-font-name))
75 :set (lambda (sym val)
77 (when (and xwem-minibuffer
78 (xwem-minib-frame xwem-minibuffer))
79 (set-face-font 'default xwem-minibuffer-font
80 (xwem-minib-frame xwem-minibuffer))))
81 :initialize 'custom-initialize-default
82 :group 'xwem-minibuffer)
84 (defcustom xwem-minibuffer-height 1
85 "Height of `xwem-minibuffer'."
87 :set (lambda (sym val)
89 ;; DO NOT RELY on `set-frame-height'
90 (let ((frame (and xwem-minibuffer (xwem-minib-frame xwem-minibuffer)))
91 (mcl (and xwem-minibuffer (xwem-minib-cl xwem-minibuffer))))
93 (setq st (/ (frame-pixel-height frame) (frame-height frame))
94 nsz (* st xwem-minibuffer-height))
95 (xwem-client-resize mcl nil nsz))))
96 :initialize 'custom-initialize-default
97 :group 'xwem-minibuffer)
99 (defcustom xwem-minibuffer-width 80
100 "*Usable width of `xwem-minibuffer' frame."
102 :set (lambda (sym val)
104 ;; DO NOT RELY on `set-frame-width'
105 (let ((frame (and xwem-minibuffer (xwem-minib-frame xwem-minibuffer)))
106 (mcl (and xwem-minibuffer (xwem-minib-cl xwem-minibuffer))))
107 (when (and frame mcl)
108 (setq st (/ (frame-pixel-width frame) (frame-width frame))
109 nsz (* st xwem-minibuffer-width))
110 (xwem-client-resize mcl nsz nil))))
111 :initialize 'custom-initialize-default
112 :group 'xwem-minibuffer)
115 (defcustom xwem-minibuffer-border-width 2
116 "Border width for `xwem-minibuffer'."
118 :set (lambda (sym val)
120 (let ((cl (and xwem-minibuffer (xwem-minib-cl xwem-minibuffer))))
122 (xwem-client-set-property
123 cl 'x-border-width xwem-minibuffer-border-width))))
124 :initialize 'custom-initialize-default
125 :group 'xwem-minibuffer)
127 (defcustom xwem-minibuffer-passive-border-color "blue3"
128 "Border color for `xwem-minibuffer'."
130 :set (lambda (sym val)
132 (let ((cl (and xwem-minibuffer (xwem-minib-cl xwem-minibuffer))))
134 (xwem-set-face-foreground
135 'x-border-face xwem-minibuffer-passive-border-color nil cl)
136 (xwem-client-set-property
138 (xwem-face-foreground
139 'x-border-face (and (xwem-cl-selected-p cl) '(selected)) cl)))))
140 :initialize 'custom-initialize-default
141 :group 'xwem-minibuffer)
143 (defcustom xwem-minibuffer-active-border-color "blue"
144 "Border color for `xwem-minibuffer' when it focused."
146 :set (lambda (sym val)
148 (let ((cl (and xwem-minibuffer (xwem-minib-cl xwem-minibuffer))))
150 (xwem-set-face-foreground
151 'x-border-face xwem-minibuffer-active-border-color
153 (xwem-client-set-property
155 (xwem-face-foreground
156 'x-border-face (and (xwem-cl-selected-p cl)
158 :initialize 'custom-initialize-default
159 :group 'xwem-minibuffer)
161 (defcustom xwem-minibuffer-hide-cursor-mode t
162 "*Non-nil mean that Emacs cursor will be invisible in `xwem-minibuffer'.
163 When `xwem-minibuffer' loses focus Emacs cursor hides, and unhides
166 :group 'xwem-minibuffer)
168 (defcustom xwem-minibuffer-hide-show-parameter 0
169 "*Animation delay parameter, when hiding/showing xwem minibuffer."
171 :group 'xwem-minibuffer)
173 (defcustom xwem-minibuffer-autohide-timeout nil
174 "*Non-nil mean xwem minibuffer will be autohided, after that many seconds."
175 :type '(choice (const :tag "Disabled" nil)
176 (number :tag "Seconds"))
177 :set (lambda (sym value)
179 (let ((mcl (xwem-minib-cl xwem-minibuffer)))
182 (xwem-minibuffer-enable-autohide-timer mcl)
184 (xwem-minibuffer-disable-autohide-timer mcl)))))
185 :initialize 'custom-initialize-default
186 :group 'xwem-minibuffer)
188 (defcustom xwem-minibiffer-always-on-top-rank 20
189 "*Always on top rank or nil."
190 :type '(choice (const :tag "No rank" nil)
191 (number :tag "Rank"))
192 :set (lambda (sym value)
194 (let ((xwin (xwem-minib-xwin xwem-minibiffer)))
197 (xwem-misc-set-xwin-always-on-top xwin value)
198 (xwem-misc-unset-always-on-top xwin)))))
199 :initialize 'custom-initialize-default
200 :group 'xwem-minibuffer)
202 (defcustom xwem-minibuffer-raise-when-active t
203 "*Non-nil mean xwem minibuffer is raised when activated."
205 :group 'xwem-minibuffer)
207 (defcustom xwem-minibuffer-emacs-frames-has-minibuffer t
208 "*Non-nil mean Emacs frames will have their own minibuffers."
210 :group 'xwem-minibuffer)
212 (defcustom xwem-minibuffer-set-default-minibuffer-frame t
213 "*Non-nil mean that xwem minibuffer frame will be set as `default-minibuffer-frame'.
214 Modify this variable only if you know what you are doing."
216 :group 'xwem-minibuffer)
219 (defcustom xwem-minibuffer-outer-border-width 1
220 "*Outer border width for xwem minibuffer."
222 :group 'xwem-minibuffer)
224 (defcustom xwem-minibuffer-outer-border-color "black"
225 "*Outer border color for xwem minibuffer."
227 :group 'xwem-minibuffer)
230 (defcustom xwem-minibuffer-focusin-hook nil
231 "*Hooks called when xwem minibuffer got focus."
233 :group 'xwem-minibuffer
237 (defcustom xwem-minibuffer-focusout-hook nil
238 "*Hooks called when xwem minibuffer lose focus."
240 :group 'xwem-minibuffer
243 (defcustom xwem-minib-resize-exact t
244 "*If non-`nil', make minibuffer frame exactly the size needed to display all its contents.
245 Otherwise, the minibuffer frame can temporarily increase in size but
246 never get smaller while it is active."
248 :group 'xwem-minibuffer)
250 (defcustom xwem-minib-specifiers
251 '((default-toolbar-visible-p . nil)
254 (default-gutter-visible-p . t)
256 (top-gutter-border-width . 1)
258 (menubar-visible-p . nil)
259 (horizontal-scrollbar-visible-p . nil)
260 ((face-font 'default) . xwem-minibuffer-font))
261 "*Alist of specifiers to be set for xwem minibuffer."
262 :type '(repeat (cons (sexp :tag "Specifier sexp")
263 (sexp :tag "Specifier value sexp")))
264 :set (lambda (sym value)
266 (when (and xwem-minibuffer
267 (frame-live-p (xwem-minib-frame xwem-minibuffer)))
268 (xwem-minib-apply-specifiers (xwem-minib-frame xwem-minibuffer))))
269 :group 'xwem-minibuffer)
271 ;;; Internal variables
275 (defvar xwem-minibuffer nil
276 "Default xwem minibuffer.")
278 (defvar xwem-minibuffer-map
279 (let ((map (make-sparse-keymap)))
280 (define-key map (xwem-kbd "H-g") 'minibuffer-keyboard-quit)
281 (define-key map (xwem-kbd "C-<button1>") 'xwem-client-imove)
283 "Keymap used while in xwem.")
286 (defun xwem-minib-apply-specifiers (frame)
287 "Apply `xwem-minib-specifiers' to FRAME."
288 (mapc #'(lambda (spc)
289 (set-specifier (eval (car spc)) (eval (cdr spc))
290 frame nil 'remove-locale))
291 xwem-minib-specifiers))
293 (defun xwem-minib-create ()
294 "Create minibuffer that will be used by xwem, or use existen."
295 (let ((mframe (or (xwem-misc-find-frame xwem-minibuffer-name
296 (minibuffer-frame-list))
297 (make-frame minibuffer-frame-plist
298 (default-x-device))))
299 (dd default-directory))
301 (setf (xwem-minib-frame xwem-minibuffer) mframe)
302 ;; Set specifiers values for MFRAME
303 (xwem-minib-apply-specifiers mframe)
304 (redraw-frame mframe t) ; KEEP THIS!
306 ;; Hack over default-directory for minibuffer buffer
308 (window-buffer (frame-root-window mframe))
309 (setq default-directory dd))
313 (defmacro xwem-cl-minibuffer (cl)
314 `(xwem-cl-get-sys-prop ,cl 'xwem-minibuffer))
315 (defsetf xwem-cl-minibuffer (cl) (minib)
316 `(xwem-cl-put-sys-prop ,cl 'xwem-minibuffer ,minib))
318 ;;; Minibuffer focus model
319 (define-xwem-focus-mode minibuffer (cl action &optional xev)
320 "Focus mode for xwem minibuffer"
321 (let ((mb (xwem-cl-minibuffer cl)))
322 (when (and (xwem-minib-p mb)
324 (not (member (X-Event-xfocus-mode xev)
325 (list X-NotifyVirtual X-NotifyNonlinearVirtual))))
326 (cond ((eq action 'focus-in)
327 ;; XWEM Minibuffer activates
328 (run-hook-with-args 'xwem-minibuffer-focusin-hook mb))
329 ((eq action 'focus-out)
330 ;; XWEM Minibuffer deactivates
331 (run-hook-with-args 'xwem-minibuffer-focusout-hook mb))))))
333 ;;;; ---- XWEM Minibuffer manage type ----
334 (defun xwem-minibuffer-client-p (cl)
335 "Return non-nil if CL is minibuffer client."
336 (xwem-cl-minibuffer cl))
338 (defun xwem-manage-minibuffer (cl)
339 "Manage method for xwem minibuffers."
340 (let* ((xgeom (make-X-Geom :x 0 ; XXX
341 :y (- (X-Geom-height (xwem-rootgeom))
342 xwem-minibuffer-outer-border-width
343 xwem-minibuffer-outer-border-width)
344 :width (- (X-Geom-width (xwem-rootgeom))
345 xwem-minibuffer-outer-border-width
346 xwem-minibuffer-outer-border-width)
347 :height (X-Geom-height-with-borders
349 :border-width xwem-minibuffer-outer-border-width))
350 (minib (make-xwem-minib
351 :frame (xwem-misc-find-emacs-frame cl)
355 (setf (xwem-minib-xwin minib)
356 (XCreateWindow (xwem-dpy) nil
360 (X-Geom-height xgeom)
361 (X-Geom-border-width xgeom)
363 (make-X-Attr :override-redirect t
366 (xwem-dpy) (XDefaultColormap (xwem-dpy))
367 xwem-minibuffer-bgcol))))
368 ;; Setup window a little
369 (when xwem-minibuffer-outer-border-color
370 (XSetWindowBorder (xwem-dpy) (xwem-minib-xwin minib)
372 (xwem-dpy) (XDefaultColormap (xwem-dpy))
373 xwem-minibuffer-outer-border-color)))
375 ;; Save CL's minibuffer
376 (setf (xwem-cl-minibuffer cl) minib)
378 ;; Setup x-border-face for minibuffer
379 (xwem-set-face-foreground 'x-border-face xwem-minibuffer-active-border-color
381 (xwem-set-face-foreground 'x-border-face xwem-minibuffer-passive-border-color
383 (xwem-client-set-property cl 'x-border-width xwem-minibuffer-border-width)
384 (xwem-client-set-property cl 'x-border-color
385 (xwem-face-foreground 'x-border-face
386 (and (xwem-cl-selected-p cl)
389 ;; Reparent xwem minib client to parent
391 (setf (X-Geom-x (xwem-cl-xgeom cl)) 0)
392 (setf (X-Geom-y (xwem-cl-xgeom cl)) 0)
393 (XReparentWindow (xwem-dpy) (xwem-minib-cl-xwin minib)
394 (xwem-minib-xwin minib) 0 0)
396 ;; Set minibuffer focus model
397 (xwem-focus-mode-set cl 'minibuffer)
399 ;; Install minibuffer local keymap
400 (xwem-use-local-map xwem-minibuffer-map cl)
402 ;; Finnally refit cl and map parent
404 (XMapWindow (xwem-dpy) (xwem-minib-xwin minib))
406 ;; Set always on top rank (if any)
407 (when xwem-minibiffer-always-on-top-rank
408 (xwem-misc-set-xwin-always-on-top
409 (xwem-minib-xwin minib) xwem-minibiffer-always-on-top-rank))
411 ;; Set default minibuffer, if not already set
412 (unless (xwem-cl-p (xwem-minib-cl xwem-minibuffer))
413 (setq xwem-minibuffer minib)
414 (when xwem-minibuffer-set-default-minibuffer-frame
415 (setq default-minibuffer-frame (xwem-minib-frame xwem-minibuffer))))
417 ;; Now activate minibuffer
419 (xwem-minib-apply-state-1 minib )))
421 (define-xwem-deffered xwem-minib-apply-pxgeom (minib)
422 "Apply MINIB's parent geometry to life."
423 (let ((pxgeom (xwem-minib-xgeom minib)))
424 (XMoveResizeWindow (xwem-dpy)
425 (xwem-minib-xwin minib)
428 (X-Geom-width pxgeom)
429 (X-Geom-height pxgeom))))
434 ;; Do `(xwem-refit (xwem-minib-cl xwem-minibuffer))' - xwem minib
435 ;; will change its width. (ONLY when xwem-minib-resize-mode is on)
437 (defun xwem-refit-minibuffer (cl)
438 "Refit xwem minibuffer client CL."
439 (xwem-debug 'xwem-misc "Minib: Refiting .. to %S" '(xwem-cl-new-xgeom cl))
441 (let ((cl-xgeom (xwem-cl-xgeom cl))
442 (cl-nx (and (xwem-cl-new-xgeom cl)
443 (X-Geom-x (xwem-cl-new-xgeom cl))))
444 (pxgeom (xwem-minib-xgeom (xwem-cl-minibuffer cl))))
445 ;; Adjust geometry a little to fill into xwem-minib-xwin and apply
447 (xwem-cl-apply-new-xgeom cl)
449 ;; CL has new x location - handle it
450 (setf (X-Geom-x pxgeom) (X-Geom-x cl-xgeom))
451 (setf (X-Geom-width pxgeom)
452 (- (X-Geom-width (xwem-rootgeom))
454 xwem-minibuffer-outer-border-width
455 xwem-minibuffer-outer-border-width))
456 (xwem-minib-apply-pxgeom (xwem-cl-minibuffer cl)))
457 (xwem-cl-correct-size-for-size
459 (make-X-Geom :x 0 :y 0
460 :width (X-Geom-width-with-borders cl-xgeom)
461 :height (X-Geom-height-with-borders cl-xgeom)
462 :border-width (X-Geom-border-width cl-xgeom))
464 (xwem-cl-apply-xgeom cl)
466 ;; Check maybe parent need to be resized/moved?
467 (unless (= (X-Geom-height-with-borders cl-xgeom)
468 (X-Geom-height pxgeom))
469 (when (eq (xwem-cl-state cl) 'active)
470 (decf (X-Geom-y pxgeom)
471 (- (X-Geom-height-with-borders cl-xgeom)
472 (X-Geom-height pxgeom))))
473 (setf (X-Geom-height pxgeom)
474 (X-Geom-height-with-borders cl-xgeom))
475 (xwem-minib-apply-pxgeom (xwem-cl-minibuffer cl)))))
477 (defun xwem-minibuffer-autohide-timer (cl)
478 (when (and (numberp xwem-minibuffer-autohide-timeout)
479 (not (xwem-cl-selected-p cl)))
480 (xwem-deactivate cl))
481 (xwem-cl-rem-sys-prop cl 'auto-hide-timer))
483 (defun xwem-minibuffer-disable-autohide-timer (cl)
484 (let ((tmr (xwem-cl-get-sys-prop cl 'auto-hide-timer)))
486 (disable-timeout tmr)
487 (xwem-cl-rem-sys-prop cl 'auto-hide-timer))))
489 (defun xwem-minibuffer-enable-autohide-timer (cl)
490 (when (numberp xwem-minibuffer-autohide-timeout)
491 (xwem-minibuffer-disable-autohide-timer cl)
492 (xwem-cl-put-sys-prop cl 'auto-hide-timer
493 (add-timeout xwem-minibuffer-autohide-timeout
494 'xwem-minibuffer-autohide-timer cl))))
496 (define-xwem-deffered xwem-minib-apply-state (minib)
497 "Apply xwem minibuffer MINIB's state to life."
498 (let* ((pgeom (xwem-minib-xgeom minib))
499 (cyo (X-Geom-height pgeom))
500 (state (xwem-cl-state (xwem-minib-cl minib)))
501 (param (and (numberp xwem-minibuffer-hide-show-parameter)
502 (not (zerop xwem-minibuffer-hide-show-parameter))
503 xwem-minibuffer-hide-show-parameter))
505 (when (not (eq state (xwem-minib-get-prop minib 'saved-state)))
506 (xwem-debug 'xwem-misc "Minib: new state .. %S" 'state)
509 (setf (X-Geom-y (xwem-minib-xgeom minib))
510 (funcall (if (eq state 'active) '- '+)
511 (X-Geom-y (xwem-minib-xgeom minib)) 1))
512 (XMoveWindow (xwem-dpy) (xwem-minib-xwin minib)
513 (X-Geom-x (xwem-minib-xgeom minib))
514 (X-Geom-y (xwem-minib-xgeom minib)))
519 (xwem-minib-put-prop minib 'saved-state state)
521 (when (and xwem-minibuffer-raise-when-active
523 (xwem-misc-raise-xwin (xwem-minib-xwin minib))))
525 (when (eq state 'active)
526 (xwem-minibuffer-enable-autohide-timer (xwem-minib-cl minib)))))
528 (defun xwem-activate-minibuffer (cl &optional type)
529 "Activate xwem minibuffer CL."
530 (cond ((eq type 'activate)
531 (xwem-minib-apply-state (xwem-cl-minibuffer cl)))
534 (when xwem-minibuffer-hide-cursor-mode
535 (set-frame-property (xwem-minib-frame (xwem-cl-minibuffer cl))
536 'text-cursor-visible-p t))
538 (xwem-minibuffer-disable-autohide-timer cl))))
540 (defun xwem-deactivate-minibuffer (cl &optional type)
541 "Deactivate xwem minibuffer client CL."
542 (cond ((eq type 'deactivate)
543 (xwem-minib-apply-state (xwem-cl-minibuffer cl)))
546 (when xwem-minibuffer-hide-cursor-mode
547 (set-frame-property (xwem-minib-frame (xwem-cl-minibuffer cl))
548 'text-cursor-visible-p nil))
549 (when xwem-minibuffer-autohide-timeout
550 (xwem-deactivate cl)))))
552 (defun xwem-iconify-minibuffer (cl)
553 "Iconify xwem minibuffer client CL."
554 (xwem-deactivate cl))
557 (define-xwem-deffered xwem-minib-focusin-autoraise (minib)
558 "Mainly for use in `xwem-minibuffer-focusout-hook'."
559 (xwem-misc-raise-xwin (xwem-minib-xwin minib)))
561 (define-xwem-deffered xwem-minib-focusout-autolower (minib)
562 "Mainly for use in `xwem-minibuffer-focusout-hook'."
563 (xwem-misc-lower-xwin (xwem-minib-xwin minib)))
565 ;;;###autoload(autoload 'xwem-minibuffer-activate "xwem-minibuffer" "" t)
566 (define-xwem-command xwem-minibuffer-activate ()
567 "Switch to xwem minibuffer if it is in active state."
569 (if (eq (active-minibuffer-window)
570 (frame-selected-window (xwem-minib-frame xwem-minibuffer)))
571 (xwem-select-client (xwem-minib-cl xwem-minibuffer))
572 (xwem-activate (xwem-minib-cl xwem-minibuffer))))
575 (defun xwem-minibuffer-init ()
576 "Initialize xwem minibuffer."
577 (xwem-message 'init "Initializing minibuffer ...")
579 (setq minibuffer-frame-plist
580 (xwem-misc-merge-plists
581 minibuffer-frame-plist
582 `(name ,xwem-minibuffer-name
584 height ,xwem-minibuffer-height
585 text-cursor-visible-p ,(not xwem-minibuffer-hide-cursor-mode)
586 width ,xwem-minibuffer-width
589 ;; Adjust initial frame params
590 (unless xwem-minibuffer-emacs-frames-has-minibuffer
591 (setq initial-frame-plist
592 (plist-put initial-frame-plist 'minibuffer nil)))
593 (setq initial-frame-plist
594 (plist-put initial-frame-plist 'wait-for-wm nil))
596 ;; Adjust default frame params
597 (unless xwem-minibuffer-emacs-frames-has-minibuffer
598 (setq default-x-frame-plist
599 (plist-put default-x-frame-plist 'minibuffer nil)))
600 (setq default-x-frame-plist
601 (plist-put default-x-frame-plist 'wait-for-wm nil))
603 ;; Create XEmacs minibuffer only frame for xwem minibuffer
604 (setq xwem-minibuffer (make-xwem-minib))
605 (setf (xwem-minib-frame xwem-minibuffer)
606 (make-initial-minibuffer-frame nil))
607 (xwem-message 'init "Initializing minibuffer ... done"))
609 ;;; Resize-minibuffer mode
610 (defvar xwem-minib-rsz-saved-height nil)
612 (defun xwem-minib-rsz-count-window-lines (&optional start end)
613 "Return number of window lines occupied by text in region.
614 The number of window lines may be greater than the number of actual lines
615 in the buffer if any wrap on the display due to their length.
617 Optional arguments START and END default to point-min and point-max,
619 (or start (setq start (point-min)))
620 (or end (setq end (point-max)))
626 (narrow-to-region start end)
628 (vertical-motion (buffer-size))))))
630 (defun xwem-minib-rsz-restore ()
631 "Restore xwem minibuffer size."
632 (xwem-minib-rsz-resize xwem-minib-rsz-saved-height)
633 (xwem-misc-lower-xwin (xwem-minib-xwin xwem-minibuffer)))
635 (defun xwem-minib-rsz-check ()
636 "Called in `pre-command-hook'.
637 Check is next command is actually keyboard quit.
638 If yes, then restore xwem minibuffer size."
639 (when (member this-command '(minibuffer-keyboard-quit keyboard-quit))
640 (xwem-minib-rsz-restore)))
642 (defun xwem-minib-rsz-resize (&optional new-height)
643 "Resize xwem minibuffer to fit either NEW-HEIGHT.
644 If NEW-HEIGHT is ommited, current window height considered."
645 (let* ((frame (xwem-minib-frame xwem-minibuffer))
646 (height (frame-height frame))
647 (lines (or new-height (1+ (xwem-minib-rsz-count-window-lines))))
649 (cond ((or new-height xwem-minib-resize-exact (> lines height))
650 (setq w (frame-pixel-height frame))
651 (set-frame-size frame (frame-width frame) lines)
652 (setq n (frame-pixel-height frame))
654 (xwem-misc-raise-xwin (xwem-minib-xwin xwem-minibuffer))
656 ;; Adjust xwem minibuffer cl height
657 (xwem-client-resize (xwem-minib-cl xwem-minibuffer) nil
659 (xwem-minib-cl-xgeom xwem-minibuffer))
663 (defun xwem-minib-rsz-setup ()
664 "Setup xwem resize minibuffer mode for xwem minibuffer."
665 (when (eq (window-frame (minibuffer-window))
666 (xwem-minib-frame xwem-minibuffer))
667 (setq xwem-minib-rsz-saved-height
668 (frame-property (selected-frame) 'height))
670 (make-local-hook 'minibuffer-exit-hook)
671 (add-hook 'minibuffer-exit-hook 'xwem-minib-rsz-restore nil t)
672 (make-local-hook 'pre-command-hook)
673 (add-hook 'pre-command-hook 'xwem-minib-rsz-check nil t)
674 (make-local-hook 'post-command-hook)
675 (add-hook 'post-command-hook 'xwem-minib-rsz-resize nil t)
677 (unless (and (boundp 'icomplete-mode)
678 (eval 'icomplete-mode)) ; shutup compiler
679 (xwem-minib-rsz-resize))
682 ;;;###autoload(autoload 'xwem-minib-resize-mode "xwem-minibuffer" "" t)
683 (define-xwem-command xwem-minib-resize-mode (arg)
684 "Start/stop xwem minibuffer auto-resize mode.
685 With prefix ARG start, without - stop."
686 (xwem-interactive "P")
688 (add-hook 'minibuffer-setup-hook 'xwem-minib-rsz-setup)
689 (remove-hook 'minibuffer-setup-hook 'xwem-minib-rsz-setup)))
691 ;;; xwem minibuffer modeline using top gutter
692 (defvar xwem-modeline-format
694 (symbol-name (xwem-cl-manage-type cl))
697 (or (car (xwem-client-application cl))
701 ;; Some additional info
703 (if (xwem-cl-marked-p cl) "*" "-")
704 (let ((reg (xwem-client-property cl 'register)))
705 (if reg (list (format "%c" reg) 'bold) "-"))
708 (list (xwem-client-name cl) 'modeline-buffer-id)
713 (delq nil (mapcar #'(lambda (mm)
714 (and (symbol-value (car mm))
716 xwem-minor-mode-alist)) " ")
719 (let ((usz (xwem-cl-get-usize cl)))
720 (format "%dx%d" (car usz) (cdr usz)))
723 (xwem-make-variable-client-local 'xwem-modeline-format)
725 (defun xwem-modeline-regenerate ()
726 "Regenerate modeline string."
727 (mapconcat #'(lambda (me)
728 (let ((cl (xwem-cl-selected)))
729 (setq cl cl) ; shutup compiler
731 (let ((str "") (faces nil))
734 (setq str (copy-sequence (car me))
736 (setq str (copy-sequence me)
738 (xwem-str-with-faces str (append '(modeline) faces)))
740 xwem-modeline-format ""))
742 (define-xwem-deffered xwem-modeline-redraw (&optional cl)
743 "Redraw xwem modeline."
744 (if (xwem-cl-alive-p cl)
745 (when (xwem-cl-selected-p cl)
746 (xwem-modeline-redraw))
748 (let* ((str (xwem-modeline-regenerate))
749 (mw (frame-width (xwem-minib-frame xwem-minibuffer))))
750 (set-specifier top-gutter (substring str 0 (and (> (length str) mw) mw))
751 (xwem-minib-frame xwem-minibuffer))
754 ;;;###autoload(autoload 'xwem-modeline-enable "xwem-minibuffer" nil t)
755 (define-xwem-command xwem-modeline-enable ()
759 (add-hook 'xwem-cl-change-hook 'xwem-modeline-redraw)
760 (add-hook 'xwem-client-select-hook 'xwem-modeline-redraw)
762 (set-specifier top-gutter-visible-p t
763 (xwem-minib-frame xwem-minibuffer))
764 ;; Start showing gutter
765 (xwem-modeline-redraw-1)
766 ;; Fix xwem minibuffer height size
768 (xwem-minib-cl xwem-minibuffer) nil
769 (+ (X-Geom-height-with-borders (xwem-minib-cl-xgeom xwem-minibuffer))
770 (gutter-pixel-height 'top (xwem-minib-frame xwem-minibuffer))
771 (specifier-instance top-gutter-border-width
772 (xwem-minib-frame xwem-minibuffer))
773 (specifier-instance top-gutter-border-width
774 (xwem-minib-frame xwem-minibuffer)))))
776 ;;;###autoload(autoload 'xwem-modeline-disable "xwem-minibuffer" nil t)
777 (define-xwem-command xwem-modeline-disable ()
781 (remove-hook 'xwem-cl-change-hook 'xwem-modeline-redraw)
782 (remove-hook 'xwem-client-select-hook 'xwem-modeline-redraw)
784 ;; Fix xwem minibuffer height size
786 (xwem-minib-cl xwem-minibuffer) nil
787 (- (X-Geom-height-with-borders (xwem-minib-cl-xgeom xwem-minibuffer))
788 (gutter-pixel-height 'top (xwem-minib-frame xwem-minibuffer))
789 (specifier-instance top-gutter-border-width
790 (xwem-minib-frame xwem-minibuffer))
791 (specifier-instance top-gutter-border-width
792 (xwem-minib-frame xwem-minibuffer))))
793 ;; Stop showing gutter
794 (set-specifier top-gutter nil
795 (xwem-minib-frame xwem-minibuffer)))
798 (provide 'xwem-minibuffer)
800 ;;;; On-load actions:
801 ;; Define application
802 (add-to-list 'xwem-applications-alist
803 `("xemacs-xwem-minibuffer"
804 (and (class-name ,(concat "^" x-emacs-application-class "$"))
805 (class-inst ,(concat "^" xwem-minibuffer-name "$")))))
808 (define-xwem-manage-model minibuffer
809 "Managing model for xwem minibuffer."
810 :cl-properties '(dummy-client-p t
812 override-skip-deselect t)
813 :match-spec '(application "xemacs-xwem-minibuffer")
815 :manage-method 'xwem-manage-minibuffer
816 :activate-method 'xwem-activate-minibuffer
817 :deactivate-method 'xwem-deactivate-minibuffer
818 :refit-method 'xwem-refit-minibuffer
819 :iconify-method 'xwem-iconify-minibuffer)
821 ;; - Before init hook
824 (add-hook 'xwem-config-read-hook 'xwem-minibuffer-init)
825 (add-hook 'xwem-before-init-hook 'xwem-minib-create))
827 ;;; xwem-minibuffer.el ends here