branch: elpa/jabber
commit e49a9afab964086d33dcb35a58283438e5fff89d
Author: Thanos Apollo <[email protected]>
Commit: Thanos Apollo <[email protected]>

    keymap: Separate shared command maps
---
 lisp/jabber-console.el    |  1 +
 lisp/jabber-iq.el         |  1 +
 lisp/jabber-keymap.el     | 71 +++++++++++++++++++++++++++++++++++++++++++++++
 lisp/jabber-util.el       | 47 -------------------------------
 lisp/jabber.el            |  1 +
 tests/jabber-test-menu.el |  4 ++-
 6 files changed, 77 insertions(+), 48 deletions(-)

diff --git a/lisp/jabber-console.el b/lisp/jabber-console.el
index 6767a01a3e..5a1b0ca2e8 100644
--- a/lisp/jabber-console.el
+++ b/lisp/jabber-console.el
@@ -25,6 +25,7 @@
 
 ;;; Code:
 
+(require 'jabber-keymap)
 (require 'jabber-util)
 (require 'jabber-truncate)
 (require 'xml)
diff --git a/lisp/jabber-iq.el b/lisp/jabber-iq.el
index a1b200b4d9..317d54c6ea 100644
--- a/lisp/jabber-iq.el
+++ b/lisp/jabber-iq.el
@@ -29,6 +29,7 @@
 
 (require 'jabber-util)
 (require 'jabber-alert)
+(require 'jabber-keymap)
 
 (define-obsolete-variable-alias '*jabber-open-info-queries*
   'jabber-open-info-queries "0.11.0")
diff --git a/lisp/jabber-keymap.el b/lisp/jabber-keymap.el
new file mode 100644
index 0000000000..eb21906d2e
--- /dev/null
+++ b/lisp/jabber-keymap.el
@@ -0,0 +1,71 @@
+;;; jabber-keymap.el --- Shared Jabber keymaps  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026  Thanos Apollo
+
+;; Maintainer: Thanos Apollo <[email protected]>
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;;; Commentary:
+
+;; Shared keymaps are assembled from command symbols without loading their
+;; owning feature modules.  The main Jabber entry point establishes the full
+;; feature load order.
+
+;;; Code:
+
+(require 'keymap-popup)
+
+(defconst jabber-keymap--common-bindings
+  '(("C-c C-i" "Info/Discovery" jabber-info-menu)
+    ("C-c C-m" "MUC" jabber-muc-menu)
+    ("C-c C-s" "Services" jabber-service-menu))
+  "Bindings shared by Jabber `special-mode' maps.")
+
+(defconst jabber-keymap--global-bindings
+  '(("C-c" "Connect" jabber-connect-all)
+    ("C-d" "Disconnect" jabber-disconnect)
+    ("C-r" "Roster" jabber-roster-popup)
+    ("C-j" "Chat with" jabber-chat-with)
+    ("C-l" "Next unread" jabber-activity-switch-to)
+    ("C-a" "Away" jabber-send-away-presence)
+    ("C-o" "Online" jabber-send-default-presence)
+    ("C-x" "Extended away" jabber-send-xa-presence)
+    ("C-p" "Set presence" jabber-send-presence)
+    ("C-b" "Switch buffer" jabber-chat-buffer-switch)
+    ("C-m" "Join MUC" jabber-muc-join))
+  "Bindings exposed through `jabber-global-keymap'.")
+
+(defun jabber-keymap--add-bindings (keymap bindings)
+  "Install BINDINGS and their popup descriptions in KEYMAP."
+  (dolist (binding bindings)
+    (pcase-let ((`(,key ,description ,command) binding))
+      (keymap-popup-add-entry keymap key description command))))
+
+(keymap-popup-define jabber-common-keymap
+  "Common Jabber commands."
+  :parent special-mode-map
+  "TAB" ("Next button" forward-button)
+  "<backtab>" ("Previous button" backward-button))
+
+(jabber-keymap--add-bindings jabber-common-keymap
+                            jabber-keymap--common-bindings)
+
+(keymap-popup-define jabber-global-keymap
+  "Global Jabber commands."
+  "C-g" ("Quit" keyboard-quit))
+
+;; keymap-popup 0.3 cannot add entries before a map has popup metadata.
+(keymap-popup-remove-entry jabber-global-keymap "C-g")
+(jabber-keymap--add-bindings jabber-global-keymap
+                            jabber-keymap--global-bindings)
+(define-key ctl-x-map "\C-j" jabber-global-keymap)
+
+(provide 'jabber-keymap)
+
+;;; jabber-keymap.el ends here
diff --git a/lisp/jabber-util.el b/lisp/jabber-util.el
index 4833c47b96..b5619f9220 100644
--- a/lisp/jabber-util.el
+++ b/lisp/jabber-util.el
@@ -34,7 +34,6 @@
 (require 'jabber-sm)
 (require 'fsm)
 (require 'password-cache)
-(require 'keymap-popup)
 
 (condition-case nil
     (require 'auth-source)
@@ -46,30 +45,14 @@
 ;; Global reference declarations
 
 (declare-function auth-source-search "auth-source" (&rest spec))
-(declare-function jabber-chat-buffer-switch "jabber-chatbuffer.el" ())
 (declare-function jabber-chat-with "jabber-chat.el"
                   (jc jid &optional other-window))
-(declare-function jabber-connect-all "jabber-core.el" (&optional arg))
-(declare-function jabber-disconnect "jabber-core.el"
-                  (&optional arg interactivep))
 (declare-function jabber-ahc-execute-command "jabber-ahc.el" (jc to node))
 (declare-function jabber-get-register "jabber-register.el" (jc to))
-(declare-function jabber-info-menu "jabber-disco.el" ())
-(declare-function jabber-muc-menu "jabber-muc.el" ())
 (declare-function jabber-muc-read-my-nickname "jabber-muc.el"
                   (jc group &optional default))
 (declare-function jabber-muc-join "jabber-muc.el"
                   (jc group nickname &optional popup))
-(declare-function jabber-roster-popup "jabber-roster.el" ())
-(declare-function jabber-send-away-presence "jabber-presence.el"
-                  (&optional status jc))
-(declare-function jabber-send-default-presence "jabber-presence.el"
-                  (&optional jc))
-(declare-function jabber-send-presence "jabber-presence.el"
-                  (show status priority &optional jc))
-(declare-function jabber-send-xa-presence "jabber-presence.el"
-                  (&optional status jc))
-(declare-function jabber-service-menu "jabber-disco.el" ())
 (defvar jabber-delay-xmlns)            ; jabber-xml.el
 (defvar jabber-delay-legacy-xmlns)     ; jabber-xml.el
 (defvar jabber-stanzas-xmlns)          ; jabber-xml.el
@@ -1084,35 +1067,5 @@ obtained from `xml-parse-region'."
   "Return non-nil if SASL library is available."
   (featurep 'sasl))
 
-;;; Shared keymaps
-
-(declare-function jabber-activity-switch-to "jabber-activity.el"
-                  (&optional jid-param))
-
-(keymap-popup-define jabber-common-keymap
-  "Common Jabber commands."
-  :parent special-mode-map
-  "C-c C-i" ("Info/Discovery" jabber-info-menu)
-  "C-c C-m" ("MUC" jabber-muc-menu)
-  "C-c C-s" ("Services" jabber-service-menu)
-  "TAB"     ("Next button" forward-button)
-  "<backtab>" ("Previous button" backward-button))
-
-(keymap-popup-define jabber-global-keymap
-  "Global Jabber commands."
-  "C-c" ("Connect" jabber-connect-all)
-  "C-d" ("Disconnect" jabber-disconnect)
-  "C-r" ("Roster" jabber-roster-popup)
-  "C-j" ("Chat with" jabber-chat-with)
-  "C-l" ("Next unread" jabber-activity-switch-to)
-  "C-a" ("Away" jabber-send-away-presence)
-  "C-o" ("Online" jabber-send-default-presence)
-  "C-x" ("Extended away" jabber-send-xa-presence)
-  "C-p" ("Set presence" jabber-send-presence)
-  "C-b" ("Switch buffer" jabber-chat-buffer-switch)
-  "C-m" ("Join MUC" jabber-muc-join))
-
-(define-key ctl-x-map "\C-j" jabber-global-keymap)
-
 (provide 'jabber-util)
 ;;; jabber-util.el ends here
diff --git a/lisp/jabber.el b/lisp/jabber.el
index 852e82fc0a..be6d85f7f9 100644
--- a/lisp/jabber.el
+++ b/lisp/jabber.el
@@ -154,6 +154,7 @@ One disabled account with a non-standard port:
   :group 'jabber)
 
 ;;; guess internal dependencies!
+(require 'jabber-keymap)
 (require 'jabber-util)
 (require 'jabber-xml)
 (require 'jabber-conn)
diff --git a/tests/jabber-test-menu.el b/tests/jabber-test-menu.el
index 4edf7b8dff..79764cca34 100644
--- a/tests/jabber-test-menu.el
+++ b/tests/jabber-test-menu.el
@@ -30,7 +30,9 @@ inherited bindings from parent mode keymaps."
 
 (ert-deftest jabber-test-menu-popup-commands-defined ()
   "Every command in a jabber popup keymap must be fboundp."
-  (let ((maps (list jabber-chat-operations-menu-map
+  (let ((maps (list jabber-common-keymap
+                    jabber-global-keymap
+                    jabber-chat-operations-menu-map
                     jabber-chat-encryption-menu-map
                     jabber-roster-popup-map
                     jabber-roster-presence-map

Reply via email to