+(defun font-menu-split-long-menu (menu)
+ "Split MENU according to `font-menu-max-items'."
+ (let ((len (length menu)))
+ (if (or (null font-menu-max-items)
+ (null (featurep 'lisp-float-type))
+ (<= len font-menu-max-items))
+ menu
+ ;; Submenu is max 2 entries longer than menu, never shorter, number of
+ ;; entries in submenus differ by at most one (with longer submenus first)
+ (let* ((outer (floor (sqrt len)))
+ (inner (/ len outer))
+ (rest (% len outer))
+ (result nil))
+ (setq menu (reverse menu))
+ (while menu
+ (let ((in inner)
+ (sub nil)
+ (to (car menu)))
+ (while (> in 0)
+ (setq in (1- in)
+ sub (cons (car menu) sub)
+ menu (cdr menu)))
+ (setq result
+ (cons (cons (if (stringp font-menu-submenu-name-format)
+ (format font-menu-submenu-name-format
+ (aref (car sub) 0) (aref to 0))
+ (funcall font-menu-submenu-name-format
+ (aref (car sub) 0) (aref to 0)))
+ sub)
+ result)
+ rest (1+ rest))
+ (if (= rest outer) (setq inner (1+ inner)))))
+ result))))
+