462
|
1 (defvar statusbar-hashtable (make-hashtable 29))
|
|
2 (defvar statusbar-gnome-p nil)
|
|
3
|
|
4 (defmacro get-frame-statusbar (frame)
|
|
5 `(gethash (or ,frame (selected-frame)) statusbar-hashtable))
|
|
6
|
|
7 (defun add-frame-statusbar (frame)
|
|
8 "Stick a GTK (or GNOME) statusbar at the bottom of the frame."
|
|
9 (if (windowp (frame-property frame 'minibuffer))
|
|
10 (puthash frame (get-frame-statusbar (window-frame (frame-property frame 'minibuffer)))
|
|
11 statusbar-hashtable)
|
|
12 (let ((sbar nil)
|
|
13 (shell (frame-property frame 'shell-widget)))
|
|
14 (if (string-match "Gnome" (gtk-type-name (gtk-object-type shell)))
|
|
15 (progn
|
|
16 (require 'gnome-widgets)
|
|
17 (setq sbar (gnome-appbar-new t t 0)
|
|
18 statusbar-gnome-p t)
|
|
19 (gtk-progress-set-format-string sbar "%p%%")
|
|
20 (gnome-app-set-statusbar shell sbar))
|
|
21 (setq sbar (gtk-statusbar-new))
|
|
22 (gtk-box-pack-end (frame-property frame 'container-widget)
|
|
23 sbar nil nil 0))
|
|
24 (puthash frame sbar statusbar-hashtable))))
|
|
25
|
|
26 (add-hook 'create-frame-hook 'add-frame-statusbar)
|
|
27 (add-hook 'delete-frame-hook (lambda (f)
|
|
28 (remhash f statusbar-hashtable)))
|
|
29
|
|
30
|
|
31 (defun clear-message (&optional label frame stdout-p no-restore)
|
|
32 (let ((sbar (get-frame-statusbar frame)))
|
|
33 (if sbar
|
|
34 (if statusbar-gnome-p
|
|
35 (gnome-appbar-pop sbar)
|
|
36 (gtk-statusbar-pop sbar 1)))))
|
|
37
|
|
38 (defun append-message (label message &optional frame stdout-p)
|
|
39 (let ((sbar (get-frame-statusbar frame)))
|
|
40 (if sbar
|
|
41 (if statusbar-gnome-p
|
|
42 (gnome-appbar-push sbar message)
|
|
43 (gtk-statusbar-push sbar 1 message)))))
|
|
44
|
|
45 (defun progress-display (fmt &optional value &rest args)
|
|
46 "Print a progress gauge and message in the bottom gutter area of the frame.
|
|
47 The arguments are the same as to `format'.
|
|
48
|
|
49 If the only argument is nil, clear any existing progress gauge."
|
|
50 (let ((sbar (get-frame-statusbar nil)))
|
|
51 (apply 'message fmt args)
|
|
52 (if statusbar-gnome-p
|
|
53 (progn
|
|
54 (gtk-progress-set-show-text (gnome-appbar-get-progress sbar) t)
|
|
55 (gnome-appbar-set-progress sbar (/ value 100.0))
|
|
56 (gdk-flush)))))
|
|
57
|
|
58 (defun lprogress-display (label fmt &optional value &rest args)
|
|
59 "Print a progress gauge and message in the bottom gutter area of the frame.
|
|
60 First argument LABEL is an identifier for this progress gauge. The rest of the
|
|
61 arguments are the same as to `format'."
|
|
62 (if (and (null fmt) (null args))
|
|
63 (prog1 nil
|
|
64 (clear-progress-display label nil))
|
|
65 (let ((str (apply 'format fmt args)))
|
|
66 (progress-display str value)
|
|
67 str)))
|
|
68
|
|
69 (defun clear-progress-display (&rest ignored)
|
|
70 (if statusbar-gnome-p
|
|
71 (let* ((sbar (get-frame-statusbar nil))
|
|
72 (progress (gnome-appbar-get-progress sbar)))
|
|
73 (gnome-appbar-set-progress sbar 0)
|
|
74 (gtk-progress-set-show-text progress nil))))
|