[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RFC: status icon support
Re: RFC: status icon support
Mon, 31 Dec 2007 11:29:51 -0700
Gnus/5.11 (Gnus v5.11) Emacs/22.0.990 (gnu/linux)
>>>>> "Dan" == Dan Nicolaescu <address@hidden> writes:
Dan> Very interesting idea!
Dan> What would the lisp code for this look like?
Use make-status-icon to make an icon. Then use
modify-status-icon-parameters to change it, or use show-status-icon-message
to display a notification.
E.g., for my ERC module I have the icon blink when someone mentions my
name in a channel. With the current API this would look like:
(modify-status-icon-parameters erc-status-status-icon '((blinking . t)))
It is also set up so that clicking on the status icon will switch to
the first buffer where someone has mentioned my nick:
'((click-callback . erc-status-select-first-buffer)))
erc-status.el isn't really ready yet though... it is still written
using the old API (using an external program). I didn't want to
rewrite it for real until something goes in.
Dan> Another possible use that comes to mind: emit some kind of notification
Dan> when a (long) compilation finishes.
Yeah. This is easy:
(defvar compilation-status-icon nil)
(defun compilation-finish-notification (buffer status)
;; No need for it to be visible; we just want to post
;; notifications for now.
(setq compilation-status-icon (make-status-icon '((visible . nil)))))
(let ((ok (string-match "finished" status)))
:icon (if ok 'info 'warning))))
(add-to-list 'compilation-finish-functions #'compilation-finish-notification)
Currently I have code (using my old zenity-based approach) for ERC,
EMMS (a pause/play button), and calendar (clicking shows the calendar,
and in theory appointments are notifications, though this has never
really worked). Compilation mode would be useful (IMO particularly if
the compilation buffer is not visible; you could also animate the icon
during compilation). Mail notification would be easy. There are
probably other possibilities too; an emacs-based replacement for the
Gnome sticky notes applet, for instance, would be pretty simple.
The other thing I wanted to do is add menu support. This looks kind
of complicated, though. Also there's an oddity in that the current
frame at the time the menu pops up may or may not be related to the
display that the status icon appears on. Maybe this doesn't matter?
This all reminds me, though -- I need to implement status-icon-p and
A few more specific questions for Emacs maintainers:
* The current code is Gtk-only. Is this ok? Or do I need to get
someone to write Windows and MacOS ports first? (I don't know much
about those platforms and I have no idea whether the same
functionality works there or not.)
* Is the current API ok? modify-status-icon-parameters uses an alist,
like modify-frame-parameters. But show-status-icon-message uses
keyword arguments, since that seemed nicer there. How's that?
What about the names of the keywords and alist keys?
* I considered making a status icon a special kind of frame, but this
looked a lot more difficult. Plus, I wasn't sure what the benefit
would be. The current code is a bit strange though -- a status icon
appears on some display, currently just whatever the default is.
But if you have multiple displays you may want to have a status icon
on each. (It is unclear to me if that is expected to work on the
Gtk side -- the status icon code always seems to use the default
display, so we'd have to switch displays around in the display
manager to get this working.)
I'm not sure what to do about the display-related oddities in
general. x-close-connection should probably close the related
status icons (though we'd have to do the bookkeeping ourselves,
since AFAICT there is no way to get this info out of Gtk). For
things like erc-status or a compile-finish-function, it seems weird
to show status on an icon that may not be readily visible to the
user. (But maybe it is ok to punt on this one.)
* Or, to sum it all up: aside from the configury bits, what do you
want to see before you will check this in?