+ (when popdown-strings
+ (combo-set-popdown-strings combo popdown-strings)))
+
+(defbinding combo-set-popdown-strings () nil
+ (combo combo)
+ (strings (glist string)))
+
+(defbinding combo-disable-activate () nil
+ (combo combo))
+
+
+
+;;;; Dialog
+
+(defmethod shared-initialize ((dialog dialog) names &rest initargs)
+ (call-next-method)
+ (dolist (button-definition (get-all initargs :button))
+ (apply #'dialog-add-button dialog button-definition)))
+
+
+(defvar %*response-id-key* (gensym))
+
+(defun %dialog-find-response-id-num (dialog response-id &optional create-p error-p)
+ (or
+ (cadr (assoc response-id (rest (type-expand-1 'response-type))))
+ (let* ((response-ids (object-data dialog %*response-id-key*))
+ (response-id-num (position response-id response-ids)))
+ (cond
+ (response-id-num)
+ (create-p
+ (cond
+ (response-ids
+ (setf (cdr (last response-ids)) (list response-id))
+ (1- (length response-ids)))
+ (t
+ (setf (object-data dialog %*response-id-key*) (list response-id))
+ 0)))
+ (error-p
+ (error "Invalid response: ~A" response-id))))))
+
+(defun %dialog-find-response-id (dialog response-id-num)
+ (if (< response-id-num 0)
+ (car
+ (rassoc
+ (list response-id-num)
+ (rest (type-expand-1 'response-type)) :test #'equalp))
+ (nth response-id-num (object-data dialog %*response-id-key*))))
+
+
+(defmethod signal-connect ((dialog dialog) signal function &key object after)
+ (let ((response-id-num (%dialog-find-response-id-num dialog signal)))
+ (cond
+ (response-id-num
+ (call-next-method
+ dialog 'response
+ #'(lambda (dialog id)
+ (when (= id response-id-num)
+ (cond
+ ((eq object t) (funcall function dialog))
+ (object (funcall function object))
+ (t (funcall function)))))
+ :object t :after after))
+ (t
+ (call-next-method)))))
+
+
+(defbinding dialog-run () nil
+ (dialog dialog))
+
+(defbinding dialog-response (dialog response-id) nil
+ (dialog dialog)
+ ((%dialog-find-response-id-num dialog response-id nil t) int))
+
+
+(defbinding %dialog-add-button () button
+ (dialog dialog)
+ (text string)
+ (response-id-num int))
+
+(defun dialog-add-button (dialog label &optional response-id default-p)
+ (let* ((response-id-num
+ (if response-id
+ (%dialog-find-response-id-num dialog response-id t)
+ (length (object-data dialog %*response-id-key*))))
+ (button (%dialog-add-button dialog label response-id-num)))
+ (unless response-id
+ (%dialog-find-response-id-num dialog button t))
+ (when default-p
+ (%dialog-set-default-response dialog response-id-num))
+ button))
+
+
+(defbinding %dialog-add-action-widget () button
+ (dialog dialog)
+ (action-widget widget)
+ (response-id-num int))
+
+(defun dialog-add-action-widget (dialog widget &optional (response-id widget)
+ default-p)
+ (let ((response-id-num (%dialog-find-response-id-num dialog response-id t)))
+ (%dialog-add-action-widget dialog widget response-id-num)
+ (when default-p
+ (%dialog-set-default-response dialog response-id-num))
+ widget))
+
+
+(defbinding %dialog-set-default-response () nil
+ (dialog dialog)
+ (response-id-num int))
+
+(defun dialog-set-default-response (dialog response-id)
+ (%dialog-set-default-response
+ dialog (%dialog-find-response-id-num dialog response-id nil t)))
+
+(defbinding dialog-set-response-sensitive (dialog response-id sensitive) nil
+ (dialog dialog)
+ ((%dialog-find-response-id-num dialog response-id nil t) int)
+ (sensitive boolean))
+
+
+;; Addition dialog functions
+
+(defmethod container-add ((dialog dialog) (child widget) &rest args)
+ (apply #'container-add (slot-value dialog 'main-area) child args))
+
+(defmethod container-remove ((dialog dialog) (child widget))
+ (container-remove (slot-value dialog 'main-area) child))
+
+(defmethod container-children ((dialog dialog))
+ (container-children (dialog-main-area dialog)))
+
+(defmethod (setf container-children) (children (dialog dialog))
+ (setf (container-children (dialog-main-area dialog)) children))
+
+
+
+;;; Drawing area -- no functions
+
+
+;;; Entry
+
+(defbinding entry-get-layout () pango:layout
+ (entry entry))
+
+(defbinding entry-get-layout-offsets () nil
+ (entry entry)
+ (x int :out)
+ (y int :out))
+
+
+
+;;; Label
+
+(defbinding label-get-layout-offsets () nil
+ (labe label)
+ (x int :out)
+ (y int :out))
+
+(defbinding label-select-region () nil
+ (label label)
+ (start int)
+ (end int))
+
+(defbinding label-get-text () string
+ (label label))
+
+(defbinding label-get-layout () pango:layout
+ (label label))
+
+(defbinding label-get-selection-bounds () boolean
+ (label label)
+ (start int :out)
+ (end int :out))