- (if (< (length button) 3)
- (error "Button descriptor is too small: %S" button))
-
- (push (gtk-button-new-with-label (aref button 0)) buttons)
-
- ;; Need to detect what flavor of descriptor it is.
- (if (not (keywordp (aref button 2)))
- ;; Simple style... just [ name callback activep ]
- ;; We ignore the 'suffix' entry, because that is what
- ;; the X code does.
- (setq activep (aref button 2))
- (let ((ctr 2)
- (len (length button)))
- (if (logand len 1)
- (error
- "Button descriptor has an odd number of keywords and values: %S"
- button))
- (while (< ctr len)
- (if (eq (aref button ctr) :active)
- (setq activep (aref button (1+ ctr))
- ctr len))
- (setq ctr (+ ctr 2)))))
+ (setq length (length button))
+
+ (cond
+ ((= length 1) ; [ "name" ]
+ (setq callback nil
+ activep nil))
+ ((= length 2) ; [ "name" callback ]
+ (setq callback (aref button 1)
+ activep t))
+ ((and (or (= length 3) (= length 4))
+ (not (keywordp (aref button 2))))
+ ;; [ "name" callback active-p ] or
+ ;; [ "name" callback active-p suffix ]
+ ;; We ignore the 'suffix' entry, because that is
+ ;; what the X code does.
+ (setq callback (aref button 1)
+ activep (aref button 2)))
+ (t ; 100% keyword specification
+ (let ((plist (cdr (mapcar 'identity button))))
+ (setq activep (plist-get plist :active)
+ callback (plist-get plist :callback)))))
+
+ ;; Create the label and determine what the mnemonic key is.
+ (setq label (gtk-label-new ""))
+ (setq accel-key (gtk-label-parse-uline label
+ (gtk-popup-convert-underscores (aref button 0))))
+ ;; Place the label in the button.
+ (gtk-misc-set-alignment label 0.5 0.5)
+ (setq gui-button (gtk-button-new))
+ (gtk-container-add gui-button label)
+ ;; Add ALT-mnemonic to the dialog's accelerator group.
+ (gtk-widget-add-accelerator gui-button "clicked" accel-group
+ accel-key
+ 8 ; GDK_MOD1_MASK
+ 4 ; GTK_ACCEL_LOCKED
+ )
+
+ (push gui-button buttons)