X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/aaa6e6cbd904c6ab2f76cfb782d6b256eb01070d..1dd03ab890afaadc72d47b304574ae9cfcbd091a:/gtk/gtk.lisp diff --git a/gtk/gtk.lisp b/gtk/gtk.lisp index 011d12f..9e39a26 100644 --- a/gtk/gtk.lisp +++ b/gtk/gtk.lisp @@ -15,14 +15,14 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gtk.lisp,v 1.11 2002-03-25 09:24:55 espen Exp $ +;; $Id: gtk.lisp,v 1.23 2004-12-20 20:00:07 espen Exp $ (in-package "GTK") ;;; Gtk version -(defbinding check-version () string +(defbinding check-version () (copy-of string) (required-major unsigned-int) (required-minor unsigned-int) (required-micro unsigned-int)) @@ -39,12 +39,34 @@ (defun gtk-version () (format nil "Gtk+ v~A.~A" major minor) (format nil "Gtk+ v~A.~A.~A" major minor micro)))) -(defbinding get-default-language () string) +(defbinding get-default-language () (copy-of pango:language)) + + +;;;; Initalization + +(defbinding (gtk-init "gtk_parse_args") () nil + "Initializes the library without opening the display." + (nil null) + (nil null)) + +(defun clg-init (&optional display) + "Initializes the system and starts the event handling" + (unless (gdk:display-get-default) + (gdk:gdk-init) + (gtk-init) + (prog1 + (gdk:display-open display) + (system:add-fd-handler + (gdk:display-connection-number) :input #'main-iterate-all) + (setq lisp::*periodic-polling-function* #'main-iterate-all) + (setq lisp::*max-event-to-sec* 0) + (setq lisp::*max-event-to-usec* 1000)))) ;;; Acccel group + ;;; Acccel label (defbinding accel-label-refetch () boolean @@ -53,6 +75,15 @@ (defbinding accel-label-refetch () boolean ;;; Adjustment +(defmethod shared-initialize ((adjustment adjustment) names &key value) + (prog1 + (call-next-method) + ;; we need to make sure that the value is set last, otherwise it + ;; may be outside current limits + (when value + (setf (slot-value adjustment 'value) value)))) + + (defbinding adjustment-changed () nil (adjustment adjustment)) @@ -65,8 +96,6 @@ (defbinding adjustment-clamp-page () nil (upper single-float)) - -;;; Alignment -- no functions ;;; Arrow -- no functions @@ -83,10 +112,6 @@ (defun (setf bin-child) (child bin) child) - -;;; Button box -- no functions - - ;;; Binding @@ -107,10 +132,10 @@ (defbinding box-pack-end () nil (fill boolean) (padding unsigned-int)) -(defun box-pack (box child &key (pack :start) (expand t) (fill t) (padding 0)) - (if (eq pack :start) - (box-pack-start box child expand fill padding) - (box-pack-end box child expand fill padding))) +(defun box-pack (box child &key end expand fill (padding 0)) + (if end + (box-pack-end box child expand fill padding) + (box-pack-start box child expand fill padding))) (defbinding box-reorder-child () nil (box box) @@ -240,62 +265,98 @@ (defbinding (color-selection-is-adjusting-p -;;; Combo +;;;; Combo Box + +(defmethod shared-initialize ((combo-box combo-box) names &key model content) + (unless model + (setf + (combo-box-model combo-box) + (make-instance 'list-store :column-types '(string))) + (unless (typep combo-box 'combo-box-entry) + (let ((cell (make-instance 'cell-renderer-text))) + (cell-layout-pack combo-box cell :expand t) + (cell-layout-add-attribute combo-box cell :text 0))) + (when content + (map 'nil #'(lambda (text) + (combo-box-append-text combo-box text)) + content))) + (call-next-method)) -(defbinding combo-set-value-in-list () nil - (combo combo) - (value boolean) - (ok-if-empty boolean)) +;; (defmethod shared-initialize :after ((combo-box combo-box) names &key active) +;; (when active +;; (signal-emit combo-box 'changed))) -(defbinding combo-set-item-string () nil - (combo combo) - (item item) - (item-value string)) +(defbinding combo-box-append-text () nil + (combo-box combo-box) + (text string)) + +(defbinding combo-box-insert-text () nil + (combo-box combo-box) + (position int) + (text string)) -(defbinding combo-set-popdown-strings () nil - (combo combo) - (strings (glist string))) +(defbinding combo-box-prepend-text () nil + (combo-box combo-box) + (text string)) -(defbinding combo-disable-activate () nil - (combo combo)) +#+gtk2.6 +(defbinding combo-box-get-active-text () string + (combo-box combo-box)) +(defbinding combo-box-popup () nil + (combo-box combo-box)) + +(defbinding combo-box-popdown () nil + (combo-box combo-box)) -;;;; Dialog -(defmethod shared-initialize ((dialog dialog) names &rest initargs) +;;;; Combo Box Entry + +(defmethod shared-initialize ((combo-box-entry combo-box-entry) names &key model) (call-next-method) - (dolist (button-definition (get-all initargs :button)) - (apply #'dialog-add-button dialog button-definition))) + (unless model + (setf (combo-box-entry-text-column combo-box-entry) 0))) + + +;;;; Dialog + +(defmethod shared-initialize ((dialog dialog) names &rest initargs + &key button buttons) + (declare (ignore button buttons)) + (prog1 + (call-next-method) + (initial-apply-add dialog #'dialog-add-button initargs :button :buttons))) (defvar %*response-id-key* (gensym)) -(defun %dialog-find-response-id-num (dialog response-id &optional create-p error-p) +(defun %dialog-find-response-id-num (dialog 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))) + (cadr (assoc id (rest (type-expand-1 'response-type)))) + (let ((response-ids (object-data dialog %*response-id-key*))) (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)))))) + ((and response-ids (position id response-ids :test #'equal))) + (create-p + (cond + (response-ids + (vector-push-extend id response-ids) + (1- (length response-ids))) + (t + (setf + (object-data dialog %*response-id-key*) + (make-array 1 :adjustable t :fill-pointer t :initial-element id)) + 0))) + (error-p + (error "Invalid response: ~A" 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*)))) + (rest (type-expand-1 'response-type)) :test #'equal)) + (aref (object-data dialog %*response-id-key*) response-id-num ))) (defmethod signal-connect ((dialog dialog) signal function &key object after) @@ -311,8 +372,7 @@ (defmethod signal-connect ((dialog dialog) signal function &key object after) (object (funcall function object)) (t (funcall function))))) :object t :after after)) - (t - (call-next-method))))) + ((call-next-method))))) (defbinding dialog-run () nil @@ -328,16 +388,19 @@ (defbinding %dialog-add-button () button (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)) +(defun dialog-add-button (dialog label &optional (response label) + &key default object after) + "Adds a button to the dialog. If no response is given, then label + will be used." + (let* ((id (if (functionp response) + label + response)) + (id-num (%dialog-find-response-id-num dialog id t)) + (button (%dialog-add-button dialog label id-num))) + (when (functionp response) + (signal-connect dialog id response :object object :after after)) + (when default + (%dialog-set-default-response dialog id-num)) button)) @@ -346,12 +409,17 @@ (defbinding %dialog-add-action-widget () button (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)) +(defun dialog-add-action-widget (dialog widget &optional (response widget) + &key default object after) + (let* ((id (if (functionp response) + widget + response)) + (id-num (%dialog-find-response-id-num dialog id t))) + (%dialog-add-action-widget dialog widget id-num) + (when (functionp response) + (signal-connect dialog id response :object object :after after)) + (when default + (%dialog-set-default-response dialog id-num)) widget)) @@ -372,20 +440,25 @@ (defbinding dialog-set-response-sensitive (dialog response-id sensitive) nil ;; Addition dialog functions (defmethod container-add ((dialog dialog) (child widget) &rest args) - (apply #'container-add (slot-value dialog 'main-area) child args)) + (apply #'container-add (dialog-vbox dialog) child args)) (defmethod container-remove ((dialog dialog) (child widget)) - (container-remove (slot-value dialog 'main-area) child)) + (container-remove (dialog-vbox dialog) child)) (defmethod container-children ((dialog dialog)) - (container-children (dialog-main-area dialog))) + (container-children (dialog-vbox dialog))) (defmethod (setf container-children) (children (dialog dialog)) - (setf (container-children (dialog-main-area dialog)) children)) + (setf (container-children (dialog-vbox dialog)) children)) + +;;; Drawing area -;;; Drawing area -- no functions +(defbinding drawing-area-get-size () nil + (drawing-area drawing-area) + (width int :out) + (height int :out)) ;;; Entry @@ -399,11 +472,53 @@ (defbinding entry-get-layout-offsets () nil (y int :out)) +;;; Image + +(defbinding image-set-from-file () nil + (image image) + (filename pathname)) + +(defbinding image-set-from-pixmap () nil + (image image) + (pixmap gdk:pixmap) + (mask gdk:bitmap)) + +(defbinding image-set-from-stock () nil + (image image) + (stock-id string) + (icon-size icon-size)) + +(defun image-set-from-pixmap-data (image pixmap-data) + (multiple-value-bind (pixmap mask) (gdk:pixmap-create pixmap-data) + (image-set-from-pixmap image pixmap mask))) + +(defun image-set-from-source (image source) + (etypecase source + (pathname (image-set-from-file image source)) + (string (if (stock-lookup source) + (setf (image-stock image) source) + (image-set-from-file image source))) + (vector (image-set-from-pixmap-data image source)))) + + +(defmethod shared-initialize ((image image) names &rest initargs + &key file pixmap source) + (prog1 + (if (vectorp pixmap) + (progn + (remf initargs :pixmap) + (apply #'call-next-method image names initargs)) + (call-next-method)) + (cond + (file (image-set-from-file image file)) + ((vectorp pixmap) (image-set-from-pixmap-data image pixmap)) + (source (image-set-from-source image source))))) + ;;; Label (defbinding label-get-layout-offsets () nil - (labe label) + (label label) (x int :out) (y int :out)) @@ -412,13 +527,13 @@ (defbinding label-select-region () nil (start int) (end int)) -(defbinding label-get-text () string +(defbinding label-get-text () string (label label)) (defbinding label-get-layout () pango:layout (label label)) -(defbinding label-get-selection-bounds () boolean +(defbinding label-get-selection-bounds () boolean (label label) (start int :out) (end int :out)) @@ -444,24 +559,7 @@ (defmethod initialize-instance ((button radio-button) (declare (ignore initargs)) (call-next-method) (when group-with - (radio-button-add-to-group item group-with))) - - -;;; Option menu - -(defbinding %option-menu-set-menu () nil - (option-menu option-menu) - (menu widget)) - -(defbinding %option-menu-remove-menu () nil - (option-menu option-menu)) - -(defun (setf option-menu-menu) (menu option-menu) - (if (not menu) - (%option-menu-remove-menu option-menu) - (%option-menu-set-menu option-menu menu)) - menu) - + (radio-button-add-to-group button group-with))) ;;; Item @@ -485,6 +583,11 @@ (defun (setf menu-item-label) (label menu-item) :visible t :parent menu-item) label) +(defun menu-item-label (menu-item) + (with-slots (child) menu-item + (when (typep child 'label) + (label-label child)))) + (defbinding %menu-item-set-submenu () nil (menu-item menu-item) (submenu menu)) @@ -498,6 +601,10 @@ (defun (setf menu-item-submenu) (submenu menu-item) (%menu-item-set-submenu menu-item submenu)) submenu) +(defbinding menu-item-set-accel-path () nil + (menu-item menu-item) + (accel-path string)) + (defbinding menu-item-select () nil (menu-item menu-item)) @@ -507,6 +614,14 @@ (defbinding menu-item-deselect () nil (defbinding menu-item-activate () nil (menu-item menu-item)) +(defbinding menu-item-toggle-size-request () nil + (menu-item menu-item) + (requisition int :out)) + +(defbinding menu-item-toggle-size-allocate () nil + (menu-item menu-item) + (allocation int)) + ;;; Radio menu item @@ -525,9 +640,10 @@ (defun radio-menu-item-add-to-group (item1 item2) (defmethod initialize-instance ((item radio-menu-item) &rest initargs &key group-with) (declare (ignore initargs)) - (call-next-method) - (when group-with - (radio-menu-item-add-to-group item group-with))) + (prog1 + (call-next-method) + (when group-with + (radio-menu-item-add-to-group item group-with)))) @@ -540,6 +656,15 @@ (defbinding toggle-button-toggled () nil ;;; Window +(defmethod initialize-instance ((window window) &rest initargs + &key accel-group accel-groups) + (declare (ignore accel-group accel-groups)) + (prog1 + (call-next-method) + (initial-add window #'window-add-accel-group + initargs :accel-group :accel-groups))) + + (defbinding window-set-wmclass () nil (window window) (wmclass-name string) @@ -566,7 +691,8 @@ (defbinding window-set-default-size (window width height) int ;(defbinding window-set-geometry-hints) -(defbinding window-list-toplevels () (glist window)) +(defbinding window-list-toplevels () (glist (copy-of window)) + "Returns a list of all existing toplevel windows.") (defbinding window-add-mnemonic (window key target) nil (window window) @@ -609,14 +735,14 @@ (defbinding window-begin-resize-drag () nil (edge gdk:window-edge) (button int) (root-x int) (root-y int) - (timestamp (unsigned-int 32))) + (timestamp unsigned-int)) (defbinding window-begin-move-drag () nil (window window) (edge gdk:window-edge) (button int) (root-x int) (root-y int) - (timestamp (unsigned-int 32))) + (timestamp unsigned-int)) (defbinding window-set-frame-dimensions () nil (window window) @@ -684,11 +810,8 @@ (defmethod (setf window-icon) (icon (window window)) -;;; File selection +;;; File chooser -(defbinding file-selection-complete () nil - (file-selection file-selection) - (pattern string)) @@ -708,13 +831,6 @@ (defbinding scrolled-window-add-with-viewport () nil - - - - - - - ;;; Statusbar (defbinding (statusbar-context-id "gtk_statusbar_get_context_id") @@ -743,62 +859,63 @@ (defbinding statusbar-remove () nil (defbinding fixed-put () nil (fixed fixed) (widget widget) - (x (signed 16)) - (y (signed 16))) + (x int) (y int)) (defbinding fixed-move () nil (fixed fixed) (widget widget) - (x (signed 16)) - (y (signed 16))) + (x int) (y int)) ;;; Notebook -(defbinding (notebook-insert-page "gtk_notebook_insert_page_menu") +(defun %notebook-position (notebook page) + (etypecase page + (int page) + (keyword (case page + (:first 0) + (:last -1) + (t (error "Invalid position keyword: ~A" page)))) + (widget (notebook-page-num notebook page t)))) + +(defun %notebook-child (notebook position) + (typecase position + (widget position) + (t (notebook-nth-page-child notebook position)))) + + +(defbinding (notebook-insert "gtk_notebook_insert_page_menu") (notebook position child tab-label &optional menu-label) nil (notebook notebook) (child widget) ((if (stringp tab-label) - (label-new tab-label) + (make-instance 'label :label tab-label) tab-label) widget) ((if (stringp menu-label) - (label-new menu-label) + (make-instance 'label :label menu-label) menu-label) (or null widget)) - (position int)) + ((%notebook-position notebook position) int)) -(defun notebook-append-page (notebook child tab-label &optional menu-label) - (notebook-insert-page notebook -1 child tab-label menu-label)) +(defun notebook-append (notebook child tab-label &optional menu-label) + (notebook-insert notebook :last child tab-label menu-label)) -(defun notebook-prepend-page (notebook child tab-label &optional menu-label) - (notebook-insert-page notebook 0 child tab-label menu-label)) +(defun notebook-prepend (notebook child tab-label &optional menu-label) + (notebook-insert notebook :first child tab-label menu-label)) -(defbinding notebook-remove-page () nil - (notebook notebook) - (page-num int)) - -; (defun notebook-current-page-num (notebook) -; (let ((page-num (notebook-current-page notebook))) -; (if (= page-num -1) -; nil -; page-num))) - -(defbinding (notebook-nth-page-child "gtk_notebook_get_nth_page") () widget +(defbinding notebook-remove-page (notebook page) nil (notebook notebook) - (page-num int)) - -(defun notebook-page-child (notebook) - (notebook-nth-page-child notebook (notebook-page notebook))) + ((%notebook-position notebook page) int)) (defbinding %notebook-page-num () int (notebook notebook) (child widget)) -(defun notebook-child-num (notebook child) +(defun notebook-page-num (notebook child &optional error-p) (let ((page-num (%notebook-page-num notebook child))) (if (= page-num -1) - nil + (when error-p + (error "~A is not a child of ~A" child notebook)) page-num))) (defbinding notebook-next-page () nil @@ -807,88 +924,109 @@ (defbinding notebook-next-page () nil (defbinding notebook-prev-page () nil (notebook notebook)) +(defbinding notebook-reorder-child (notebook child position) nil + (notebook notebook) + (child widget) + ((%notebook-position notebook position) int)) + (defbinding notebook-popup-enable () nil (notebook notebook)) (defbinding notebook-popup-disable () nil (notebook notebook)) -; (defbinding (notebook-tab-label "gtk_notebook_get_tab_label") -; (notebook ref) widget -; (notebook notebook) -; ((if (typep ref 'widget) -; ref -; (notebook-nth-page-child notebook ref)) -; widget)) - -; (defbinding %notebook-set-tab-label () nil -; (notebook notebook) -; (reference widget) -; (tab-label widget)) - -; (defun (setf notebook-tab-label) (tab-label notebook reference) -; (let ((tab-label-widget (if (stringp tab-label) -; (label-new tab-label) -; tab-label))) -; (%notebook-set-tab-label -; notebook -; (if (typep reference 'widget) -; reference -; (notebook-nth-page-child notebook reference)) -; tab-label-widget) -; tab-label-widget)) - -; (defbinding (notebook-menu-label "gtk_notebook_get_menu_label") -; (notebook ref) widget -; (notebook notebook) -; ((if (typep ref 'widget) -; ref -; (notebook-nth-page-child notebook ref)) -; widget)) - -; (defbinding %notebook-set-menu-label () nil -; (notebook notebook) -; (reference widget) -; (menu-label widget)) - -; (defun (setf notebook-menu-label) (menu-label notebook reference) -; (let ((menu-label-widget (if (stringp menu-label) -; (label-new menu-label) -; menu-label))) -; (%notebook-set-menu-label -; notebook -; (if (typep reference 'widget) -; reference -; (notebook-nth-page-child notebook reference)) -; menu-label-widget) -; menu-label-widget)) - -(defbinding notebook-query-tab-label-packing (notebook ref) nil +(defbinding (notebook-nth-page-child "gtk_notebook_get_nth_page") + (notebook page) widget (notebook notebook) - ((if (typep ref 'widget) - ref - (notebook-nth-page-child notebook ref)) - widget) + ((case page + (:first 0) + (:last -1) + (t page)) int)) + + +(defbinding %notebook-get-current-page () int + (notebook notebook)) + +(defun notebook-current-page-num (notebook) + (let ((num (%notebook-get-current-page notebook))) + (when (>= num 0) + num))) + +(defun notebook-current-page (notebook) + (let ((page-num (notebook-current-page-num notebook))) + (when page-num + (notebook-nth-page-child notebook page-num)))) + +(defbinding %notebook-set-current-page () nil + (notebook notebook) + (page-num int)) + +(defun (setf notebook-current-page) (page notebook) + (%notebook-set-current-page notebook (%notebook-position notebook page)) + page) + + +(defbinding (notebook-tab-label "gtk_notebook_get_tab_label") + (notebook page) widget + (notebook notebook) + ((%notebook-child notebook page) widget)) + +(defbinding (notebook-tab-label-text "gtk_notebook_get_tab_label_text") + (notebook page) (copy-of string) + (notebook notebook) + ((%notebook-child notebook page) widget)) + +(defbinding %notebook-set-tab-label () nil + (notebook notebook) + (page widget) + (tab-label widget)) + +(defun (setf notebook-tab-label) (tab-label notebook page) + (let ((widget (if (stringp tab-label) + (make-instance 'label :label tab-label) + tab-label))) + (%notebook-set-tab-label notebook (%notebook-child notebook page) widget) + widget)) + + +(defbinding (notebook-menu-label "gtk_notebook_get_menu_label") + (notebook page) widget + (notebook notebook) + ((%notebook-child notebook page) widget)) + +(defbinding (notebook-menu-label-text "gtk_notebook_get_menu_label_text") + (notebook page) (copy-of string) + (notebook notebook) + ((%notebook-child notebook page) widget)) + +(defbinding %notebook-set-menu-label () nil + (notebook notebook) + (page widget) + (menu-label widget)) + +(defun (setf notebook-menu-label) (menu-label notebook page) + (let ((widget (if (stringp menu-label) + (make-instance 'label :label menu-label) + menu-label))) + (%notebook-set-menu-label notebook (%notebook-child notebook page) widget) + widget)) + + +(defbinding notebook-query-tab-label-packing (notebook page) nil + (notebook notebook) + ((%notebook-child notebook page) widget) (expand boolean :out) (fill boolean :out) (pack-type pack-type :out)) -(defbinding - notebook-set-tab-label-packing (notebook ref expand fill pack-type) nil +(defbinding notebook-set-tab-label-packing + (notebook page expand fill pack-type) nil (notebook notebook) - ((if (typep ref 'widget) - ref - (notebook-nth-page-child notebook ref)) - widget) + ((%notebook-child notebook page) widget) (expand boolean) (fill boolean) (pack-type pack-type)) -(defbinding notebook-reorder-child () nil - (notebook notebook) - (child widget) - (position int)) - ;;; Paned @@ -905,25 +1043,6 @@ (defbinding paned-pack2 () nil (resize boolean) (shrink boolean)) -;; gtkglue.c -(defbinding paned-child1 () widget - (paned paned) - (resize boolean :out) - (shrink boolean :out)) - -;; gtkglue.c -(defbinding paned-child2 () widget - (paned paned) - (resize boolean :out) - (shrink boolean :out)) - -(defun (setf paned-child1) (child paned) - (paned-pack1 paned child nil t)) - -(defun (setf paned-child2) (child paned) - (paned-pack2 paned child t t)) - - ;;; Layout @@ -939,30 +1058,23 @@ (defbinding layout-move () nil (x int) (y int)) -(defbinding layout-set-size () nil - (layout layout) - (width int) - (height int)) - -(defbinding layout-get-size () nil - (layout layout) - (width int :out) - (height int :out)) - ;;; Menu shell -(defbinding menu-shell-insert () nil +(defbinding menu-shell-insert (menu-shell menu-item position) nil (menu-shell menu-shell) (menu-item menu-item) - (position int)) + ((case position + (:first 0) + (:last -1) + (t position)) int)) (defun menu-shell-append (menu-shell menu-item) - (menu-shell-insert menu-shell menu-item -1)) + (menu-shell-insert menu-shell menu-item :last)) (defun menu-shell-prepend (menu-shell menu-item) - (menu-shell-insert menu-shell menu-item 0)) + (menu-shell-insert menu-shell menu-item :fisrt)) (defbinding menu-shell-deactivate () nil (menu-shell menu-shell)) @@ -981,24 +1093,47 @@ (defbinding menu-shell-activate-item () nil -; ;;; Menu bar +;;; Menu -; (defbinding menu-bar-insert () nil -; (menu-bar menu-bar) -; (menu menu) -; (position int)) - -; (defun menu-bar-append (menu-bar menu) -; (menu-bar-insert menu-bar menu -1)) - -; (defun menu-bar-prepend (menu-bar menu) -; (menu-bar-insert menu-bar menu 0)) +(defun %menu-position (menu child) + (etypecase child + (int child) + (keyword (case child + (:first 0) + (:last -1) + (t (error "Invalid position keyword: ~A" child)))) + (widget (menu-child-position menu child)))) +(defbinding menu-reorder-child (menu menu-item position) nil + (menu menu) + (menu-item menu-item) + ((%menu-position menu position) int)) -; ;;; Menu +(def-callback-marshal %menu-popup-callback (nil (x int) (y int) (push-in boolean))) -;(defun menu-popup ...) +(defbinding %menu-popup () nil + (menu menu) + (parent-menu-shell (or null menu-shell)) + (parent-menu-item (or null menu-item)) + (callback-func (or null pointer)) + (callback-id unsigned-int) + (button unsigned-int) + (activate-time (unsigned 32))) + +(defun menu-popup (menu button activate-time &key callback parent-menu-shell + parent-menu-item) + (if callback + (with-callback-function (id callback) + (%menu-popup + menu parent-menu-shell parent-menu-item + (callback %menu-popup-callback) id button activate-time)) + (%menu-popup + menu parent-menu-shell parent-menu-item nil 0 button activate-time))) + +(defbinding menu-set-accel-path () nil + (menu menu) + (accel-path string)) (defbinding menu-reposition () nil (menu menu)) @@ -1006,17 +1141,20 @@ (defbinding menu-reposition () nil (defbinding menu-popdown () nil (menu menu)) +(defun menu-child-position (menu child) + (position child (container-children menu))) + +(defun menu-active-num (menu) + (menu-child-position menu (menu-active menu))) + (defbinding %menu-set-active () nil (menu menu) (index unsigned-int)) -(defun (setf menu-active) (menu index) - (%menu-set-active menu index)) +(defun (setf menu-active) (menu child) + (%menu-set-active menu (%menu-position menu child)) + child) -(defbinding menu-reorder-child () nil - (menu menu) - (menu-item menu-item) - (position int)) ;;; Table @@ -1027,17 +1165,16 @@ (defbinding table-resize () nil (columns unsigned-int)) (defbinding table-attach (table child left right top bottom - &key (x-options '(:expand :fill)) - (y-options '(:expand :fill)) - (x-padding 0) (y-padding 0)) nil + &key options x-options y-options + (x-padding 0) (y-padding 0)) nil (table table) (child widget) (left unsigned-int) (right unsigned-int) (top unsigned-int) (bottom unsigned-int) - (x-options attach-options) - (y-options attach-options) + ((append (mklist options) (mklist x-options)) attach-options) + ((append (mklist options) (mklist y-options)) attach-options) (x-padding unsigned-int) (y-padding unsigned-int)) @@ -1101,18 +1238,6 @@ (defun table-col-spacing (table &optional col) ;;; Toolbar -;; gtkglue.c -(defbinding toolbar-num-children () int - (toolbar toolbar)) - -(defun %toolbar-position-num (toolbar position) - (case position - (:prepend 0) - (:append (toolbar-num-children toolbar)) - (t - (assert (and (>= position 0) (< position (toolbar-num-children toolbar)))) - position))) - (defbinding %toolbar-insert-element () widget (toolbar toolbar) (type toolbar-child-type) @@ -1125,80 +1250,85 @@ (defbinding %toolbar-insert-element () widget (nil null) (position int)) -(defun toolbar-insert-element (toolbar position - &key tooltip-text tooltip-private-text - type widget icon text callback) - (let* ((icon-widget (typecase icon - ((or null widget) icon) - (t (pixmap-new icon)))) - (toolbar-child - (%toolbar-insert-element - toolbar (or type (and widget :widget) :button) - widget text tooltip-text tooltip-private-text icon-widget - (%toolbar-position-num toolbar position)))) +(defbinding %toolbar-insert-stock () widget + (toolbar toolbar) + (stock-id string) + (tooltip-text string) + (tooltip-private-text string) + (nil null) + (nil null) + (position int)) + +(defun toolbar-insert (toolbar position element + &key tooltip-text tooltip-private-text + type icon group callback object) + (let* ((numpos (case position + (:first -1) + (:last 0) + (t position))) + (widget + (cond + ((or + (eq type :space) + (and (not type) (eq element :space))) + (%toolbar-insert-element + toolbar :space nil nil + tooltip-text tooltip-private-text nil numpos)) + ((or + (eq type :widget) + (and (not type) (typep element 'widget))) + (%toolbar-insert-element + toolbar :widget element nil + tooltip-text tooltip-private-text nil numpos)) + ((or + (eq type :stock) + (and + (not type) + (typep element 'string) + (stock-lookup element))) + (%toolbar-insert-stock + toolbar element tooltip-text tooltip-private-text numpos)) + ((typep element 'string) + (%toolbar-insert-element + toolbar (or type :button) (when (eq type :radio-button) group) + element tooltip-text tooltip-private-text + (etypecase icon + (null nil) + (widget icon) + ((or pathname string vector) + (make-instance 'image + :source icon ; :icon-size (toolbar-icon-size toolbar) + ))) + numpos)) + ((error "Invalid element type: ~A" element))))) (when callback - (signal-connect toolbar-child 'clicked callback)) - toolbar-child)) + (signal-connect widget 'clicked callback :object object)) + widget)) -(defun toolbar-append-element (toolbar &key tooltip-text tooltip-private-text - type widget icon text callback) - (toolbar-insert-element - toolbar :append :type type :widget widget :icon icon :text text +(defun toolbar-append (toolbar element &key tooltip-text tooltip-private-text + type icon group callback object) + (toolbar-insert + toolbar :first element :type type :icon icon :group group :tooltip-text tooltip-text :tooltip-private-text tooltip-private-text - :callback callback)) + :callback callback :object object)) -(defun toolbar-prepend-element (toolbar &key tooltip-text tooltip-private-text - type widget icon text callback) - (toolbar-insert-element - toolbar :prepend :type type :widget widget :icon icon :text text +(defun toolbar-prepend (toolbar element &key tooltip-text tooltip-private-text + type icon group callback object) + (toolbar-insert + toolbar :last element :type type :icon icon :group group :tooltip-text tooltip-text :tooltip-private-text tooltip-private-text - :callback callback)) + :callback callback :object object)) + (defun toolbar-insert-space (toolbar position) - (toolbar-insert-element toolbar position :type :space)) + (toolbar-insert toolbar position :space)) (defun toolbar-append-space (toolbar) - (toolbar-insert-space toolbar :append)) + (toolbar-append toolbar :space)) (defun toolbar-prepend-space (toolbar) - (toolbar-insert-space toolbar :prepend)) + (toolbar-prepend toolbar :space)) -(defun toolbar-insert-widget (toolbar widget position &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-element - toolbar position :widget widget :tooltip-text tooltip-text - :tooltip-private-text tooltip-private-text :callback callback)) - -(defun toolbar-append-widget (toolbar widget &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-widget - toolbar widget :append :tooltip-text tooltip-text - :tooltip-private-text tooltip-private-text :callback callback)) - -(defun toolbar-prepend-widget (toolbar widget &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-widget - toolbar widget :prepend :tooltip-text tooltip-text - :tooltip-private-text tooltip-private-text :callback callback)) - -(defun toolbar-insert-item (toolbar text icon position &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-element - toolbar position :text text :icon icon :callback callback - :tooltip-text tooltip-text :tooltip-private-text tooltip-private-text)) - -(defun toolbar-append-item (toolbar text icon &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-item - toolbar text icon :append :callback callback - :tooltip-text tooltip-text :tooltip-private-text tooltip-private-text)) - - -(defun toolbar-prepend-item (toolbar text icon &key tooltip-text - tooltip-private-text callback) - (toolbar-insert-item - toolbar text icon :prepend :callback callback - :tooltip-text tooltip-text :tooltip-private-text tooltip-private-text)) (defun toolbar-enable-tooltips (toolbar) (setf (toolbar-tooltips-p toolbar) t)) @@ -1207,19 +1337,29 @@ (defun toolbar-disable-tooltips (toolbar) (setf (toolbar-tooltips-p toolbar) nil)) +(defbinding toolbar-remove-space () nil + (toolbar toolbar) + (position int)) +(defbinding toolbar-unset-icon-size () nil + (toolbar toolbar)) - - +(defbinding toolbar-unset-style () nil + (toolbar toolbar)) ;;; Editable -#| + (defbinding editable-select-region (editable &optional (start 0) end) nil (editable editable) (start int) ((or end -1) int)) +(defbinding editable-get-selection-bounds (editable) nil + (editable editable) + (start int :out) + (end int :out)) + (defbinding editable-insert-text (editable text &optional (position 0)) nil (editable editable) @@ -1261,17 +1401,9 @@ (defbinding editable-copy-clipboard () nil (defbinding editable-paste-clipboard () nil (editable editable)) -; (defbinding editable-claim-selection () nil -; (editable editable) -; (claim boolean) -; (time unsigned-int)) - (defbinding editable-delete-selection () nil (editable editable)) -; (defbinding editable-changed () nil -; (editable editable)) -|# ;;; Spin button @@ -1307,59 +1439,40 @@ (defbinding ruler-draw-pos () nil ;;; Range -#| -(defbinding range-draw-background () nil - (range range)) -(defbinding range-clear-background () nil - (range range)) +(defun range-lower (range) + (adjustment-lower (range-adjustment range))) -(defbinding range-draw-trough () nil - (range range)) +(defun range-upper (range) + (adjustment-upper (range-adjustment range))) -(defbinding range-draw-slider () nil - (range range)) +(defun (setf range-lower) (value range) + (setf (adjustment-lower (range-adjustment range)) value)) -(defbinding range-draw-step-forw () nil - (range range)) +(defun (setf range-upper) (value range) + (setf (adjustment-upper (range-adjustment range)) value)) -(defbinding range-slider-update () nil - (range range)) +(defun range-page-increment (range) + (adjustment-page-increment (range-adjustment range))) -(defbinding range-trough-click () int - (range range) - (x int) - (y int) - (jump-perc single-float :out)) +(defun range-step-increment (range) + (adjustment-step-increment (range-adjustment range))) -(defbinding range-default-hslider-update () nil - (range range)) +(defun (setf range-page-increment) (value range) + (setf (adjustment-page-increment (range-adjustment range)) value)) -(defbinding range-default-vslider-update () nil - (range range)) +(defun (setf range-step-increment) (value range) + (setf (adjustment-step-increment (range-adjustment range)) value)) -(defbinding range-default-htrough-click () int +(defbinding range-set-range () nil (range range) - (x int) - (y int) - (jump-perc single-float :out)) + (lower double-float) + (upper double-float)) -(defbinding range-default-vtrough-click () int +(defbinding range-set-increments () nil (range range) - (x int) - (y int) - (jump-perc single-float :out)) - -(defbinding range-default-hmotion () int - (range range) - (x-delta int) - (y-delta int)) - -(defbinding range-default-vmotion () int - (range range) - (x-delta int) - (y-delta int)) -|# + (step double-float) + (page double-float)) ;;; Scale @@ -1375,7 +1488,57 @@ (defbinding progress-bar-pulse () nil (progress-bar progress-bar)) +;;; Size group + +(defmethod initialize-instance ((size-group size-group) &rest initargs + &key widget widgets) + (declare (ignore widget widgets)) + (prog1 + (call-next-method) + (initial-add size-group #'size-group-add-widget + initargs :widget :widgets))) + + +(defbinding size-group-add-widget () nil + (size-group size-group) + (widget widget)) + +(defbinding size-group-remove-widget () nil + (size-group size-group) + (widget widget)) + + +;;; Stock items + +(defbinding %stock-item-copy () pointer + (location pointer)) +(defbinding %stock-item-free () nil + (location pointer)) + +(defmethod reference-foreign ((class (eql (find-class 'stock-item))) location) + (%stock-item-copy location)) + +(defmethod unreference-foreign ((class (eql (find-class 'stock-item))) location) + (%stock-item-free location)) + +(defbinding stock-add (stock-item) nil + (stock-item stock-item) + (1 unsigned-int)) + +(defbinding stock-list-ids () (gslist string)) + +(defbinding %stock-lookup () boolean + (stock-id string) + (location pointer)) + +(defun stock-lookup (stock-id) + (let ((location + (allocate-memory (proxy-instance-size (find-class 'stock-item))))) + (unwind-protect + (when (%stock-lookup stock-id location) + (ensure-proxy-instance 'stock-item (%stock-item-copy location))) + (deallocate-memory location)))) ;;; Tooltips @@ -1422,22 +1585,6 @@ (defbinding rc-get-style () style ;;; Accelerator Groups #| -(defbinding accel-group-get-default () accel-group) - -(deftype-method alien-ref accel-group (type-spec) - (declare (ignore type-spec)) - '%accel-group-ref) - -(deftype-method alien-unref accel-group (type-spec) - (declare (ignore type-spec)) - '%accel-group-unref) - -(defbinding %accel-group-ref () accel-group - (accel-group (or accel-group pointer))) - -(defbinding %accel-group-unref () nil - (accel-group (or accel-group pointer))) - (defbinding accel-group-activate (accel-group key modifiers) boolean (accel-group accel-group) ((gdk:keyval-from-name key) unsigned-int)