From: Steve V. <st...@he...> - 2011-12-29 07:36:39
|
Some years ago I originally tried out emacs-jabber, around version 0,6 or 0.7, when there was less divergence between Emacs and XEmacs and it was fairly easy to get it working in XEmacs. Over the summer I had a need for a better Jabber client and put a little more time into getting emacs-jabber 0.7.1 working in XEmacs 21.4. That's still pretty old, I admit, but sufficiently functional for my purposes. 0.8.0 and later have some more significant problems in XEmacs that I haven't figured out how to address yet, but some of what I did for 0.7.1 may help anyone (who still might care) get a more recent version working in XEmacs. I have a couple of suggestions that actually clean up the emacs-jabber code somewhat as well as fix XEmacs portability problems: 1. Insert (require 'timer) in a couple of strategic places (fsm.el and jabber-util.el) which in Emacs just ensures that the run-with-timer and cancel-timer functions are present, and in XEmacs loads a compatibility package that defines those functions in terms of the itimer functions, which eliminates the need for the conditional definition of jabber-cancel-timer. 2. Use easymenu for constructing the menus; this package is a standard part of both Emacs and XEmacs and provides a template-based system for defining menus, which is also much more concise and easier to work with than creating menus with define-key in Emacs. A patch that shows what these changes look like in emacs-jabber 0.7.1 is appended below. (I also backported the feature to suppress keepalive messages unless jabber-keepalive-debug is non-nil.) With emacs-jabber 0.8.0 and later, XEmacs is missing custom-autoload and has major problems with the newer version of fsm.el, which I haven't been able to debug yet. --- fsm.el 2011/07/26 17:29:15 1.1 +++ fsm.el 2011/08/04 17:56:40 @@ -56,6 +56,7 @@ ;;; Code: (eval-when-compile (require 'cl)) +(require 'timer) (defvar fsm-debug "*fsm-debug*" "Name of buffer for fsm debug messages. --- jabber-autoaway.el 2011/07/27 00:44:08 1.1 +++ jabber-autoaway.el 2011/07/27 00:41:13 @@ -89,7 +89,7 @@ "Start autoaway timer." (interactive) (when jabber-autoaway-timer - (jabber-cancel-timer jabber-autoaway-timer)) + (cancel-timer jabber-autoaway-timer)) (setq jabber-autoaway-timer (run-with-timer (* jabber-autoaway-timeout 60) nil #'jabber-autoaway-timer)) (jabber-autoaway-message "Autoaway timer started")) @@ -98,7 +98,7 @@ "Stop autoaway timer." (interactive) (when jabber-autoaway-timer - (jabber-cancel-timer jabber-autoaway-timer) + (cancel-timer jabber-autoaway-timer) (setq jabber-autoaway-timer nil) (jabber-autoaway-message "Autoaway timer stopped"))) --- jabber-chatbuffer.el 2011/08/03 18:33:57 1.1 +++ jabber-chatbuffer.el 2011/08/03 18:35:17 @@ -67,6 +67,7 @@ (setq major-mode 'jabber-chat-mode mode-name "jabber-chat") (use-local-map jabber-chat-mode-map) + (easy-menu-add jabber-menu) (if (fboundp 'run-mode-hooks) (run-mode-hooks 'jabber-chat-mode-hook) --- jabber-core.el 2011/07/27 01:07:02 1.1 +++ jabber-core.el 2011/07/27 00:41:34 @@ -232,7 +232,7 @@ "Re-initialise jabber package variables. Call this function after disconnection." (when jabber-choked-timer - (jabber-cancel-timer jabber-choked-timer) + (cancel-timer jabber-choked-timer) (setq jabber-choked-timer nil)) (when (get-buffer jabber-roster-buffer) --- jabber-keepalive.el 2011/07/26 01:14:19 1.1 +++ jabber-keepalive.el 2011/07/27 10:41:57 @@ -42,6 +42,9 @@ (defvar jabber-keepalive-timeout-timer nil "Timer object for keepalive timeout function") +(defvar jabber-keepalive-debug nil + "Show keepalive messages in echo area") + (defun jabber-keepalive-start () "Activate keepalive" (interactive) @@ -60,11 +63,12 @@ (interactive) (when jabber-keepalive-timer - (jabber-cancel-timer jabber-keepalive-timer) + (cancel-timer jabber-keepalive-timer) (setq jabber-keepalive-timer nil))) (defun jabber-keepalive-do () - (message "%s: sending keepalive packet" (current-time-string)) + (when jabber-keepalive-debug + (message "%s: sending keepalive packet" (current-time-string))) (setq jabber-keepalive-timeout-timer (run-with-timer jabber-keepalive-timeout nil @@ -78,13 +82,14 @@ 'jabber-keepalive-got-response nil)) (defun jabber-keepalive-got-response (&rest args) - (message "%s: got keepalive response" (current-time-string)) - (jabber-cancel-timer jabber-keepalive-timeout-timer) + (when jabber-keepalive-debug + (message "%s: got keepalive response" (current-time-string))) + (cancel-timer jabber-keepalive-timeout-timer) (setq jabber-keepalive-timeout-timer nil)) (defun jabber-keepalive-timeout () (message "%s: keepalive timeout, connection considered lost" (current-time-string)) - (jabber-cancel-timer jabber-keepalive-timer) + (cancel-timer jabber-keepalive-timer) (setq jabber-keepalive-timer nil) (run-hooks jabber-lost-connection-hook) --- jabber-menu.el 2011/08/03 18:34:17 1.1 +++ jabber-menu.el 2011/08/04 00:41:18 @@ -19,68 +19,38 @@ ;; along with this program; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -(defvar jabber-menu (make-sparse-keymap "jabber-menu")) +(require 'easymenu) -(defun jabber-menu (&optional remove) - "Put \"Jabber\" menu on menubar. -With prefix argument, remove it." - (interactive "P") - (define-key global-map - [menu-bar jabber-menu] - (and (not remove) (cons "Jabber" jabber-menu)))) +(defvar jabber-menu) -(define-key jabber-menu - [jabber-menu-connect] - '("Connect" . jabber-connect)) +(easy-menu-define jabber-menu '(jabber-roster-mode-map jabber-chat-mode-map) + "Jabber mode" + '("Jabber" + [ "Connect" jabber-connect (not *jabber-connected*) ] + [ "Disconnect" jabber-disconnect *jabber-connected* ] + [ "Switch to roster" jabber-switch-to-roster-buffer t ] + [ "Customize" jabber-customize t ] + [ "Help" jabber-info t ] + ("Set Status" + [ "Online" jabber-send-default-presence *jabber-connected* ] + [ "Away" jabber-send-away-presence *jabber-connected* ] + [ "Extended away" jabber-send-xa-presence *jabber-connected* ] + [ "Chatty" + (lambda () (interactive) + (jabber-send-presence + "chat" + (jabber-read-with-input-method "status message: " *jabber-current-status* '*jabber-status-history*) + (int-to-string *jabber-current-priority*))) + *jabber-connected* ] + [ "Do not disturb" + (lambda () (interactive) + (jabber-send-presence + "dnd" + (jabber-read-with-input-method "status message: " *jabber-current-status* '*jabber-status-history*) + (int-to-string *jabber-current-priority*))) + *jabber-connected* ]) + )) -(define-key jabber-menu - [jabber-menu-disconnect] - '("Disconnect" . jabber-disconnect)) - -(define-key jabber-menu - [jabber-menu-roster] - '("Switch to roster" . jabber-switch-to-roster-buffer)) - -(define-key jabber-menu - [jabber-menu-customize] - '("Customize" . jabber-customize)) - -(define-key jabber-menu - [jabber-menu-info] - '("Help" . jabber-info)) - -(define-key jabber-menu - [jabber-menu-status] - (cons "Set Status" (make-sparse-keymap "set-status"))) - -(defmacro jabber-define-status-key (title show) - (list 'let (list ( list 'func (list 'make-symbol (list 'concat "jabber-send-presence-" show))) - (list 'menu-item (list 'make-symbol (list 'concat "jabber-menu-status-" show)))) - (list 'fset 'func `(lambda () (interactive) - (jabber-send-presence ,show - (jabber-read-with-input-method "status message: " *jabber-current-status* '*jabber-status-history*) - (format "%d" *jabber-current-priority*)))) - (list 'define-key 'jabber-menu - (list 'vector ''jabber-menu-status 'menu-item) - (list 'cons title 'func)))) - -;;;(dolist (presence jabber-presence-strings) -;;; (jabber-define-status-key (cdr presence) (car presence))) -;;(jabber-define-status-key "Online" "") - -(jabber-define-status-key "Chatty" "chat") -;;(jabber-define-status-key "Away" "away") -;;(jabber-define-status-key "Extended Away" "xa") -(jabber-define-status-key "Do not Disturb" "dnd") -(define-key jabber-menu - [jabber-menu-status jabber-menu-status-xa] - '("Extended Away" . jabber-send-xa-presence)) -(define-key jabber-menu - [jabber-menu-status jabber-menu-status-away] - '("Away" . jabber-send-away-presence)) -(define-key jabber-menu - [jabber-menu-status jabber-menu-status-online] - '("Online" . jabber-send-default-presence)) (defvar jabber-jid-chat-menu nil "Menu items for chat menu") --- jabber-roster.el 2011/08/03 18:33:57 1.1 +++ jabber-roster.el 2011/08/03 18:35:17 @@ -203,6 +203,7 @@ (setq major-mode 'jabber-roster-mode mode-name "jabber-roster") (use-local-map jabber-roster-mode-map) + (easy-menu-add jabber-menu) (setq buffer-read-only t) (if (fboundp 'run-mode-hooks) (run-mode-hooks 'jabber-roster-mode-hook) --- jabber-util.el 2011/07/27 00:40:13 1.1 +++ jabber-util.el 2011/08/04 17:57:11 @@ -20,6 +20,7 @@ ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA (eval-when-compile (require 'cl)) +(require 'timer) (defvar jabber-jid-history nil "History of entered JIDs") @@ -83,14 +84,6 @@ (+ (* 65536.0 (car specified-time)) (cadr specified-time)))) -(cond - ((fboundp 'cancel-timer) - (defalias 'jabber-cancel-timer 'cancel-timer)) - ((fboundp 'delete-itimer) - (defalias 'jabber-cancel-timer 'delete-itimer)) - (t - (error "No `cancel-timer' function found"))) - (defun jabber-jid-username (string) "return the username portion of a JID, or nil if no username" (when (string-match "\\(.*\\)@.*\\(/.*\\)?" string) |