X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/31700e82d4655e390c4ab470930d7aa7b6d9ddfe..72c5477328296de1c648096ca25e1fa927e0d366:/gtk/gtk.lisp diff --git a/gtk/gtk.lisp b/gtk/gtk.lisp index d54aaca..9825d62 100644 --- a/gtk/gtk.lisp +++ b/gtk/gtk.lisp @@ -1,21 +1,26 @@ -;; Common Lisp bindings for GTK+ v2.0 -;; Copyright (C) 1999-2001 Espen S. Johnsen +;; Common Lisp bindings for GTK+ v2.x +;; Copyright 1999-2005 Espen S. Johnsen ;; -;; This library is free software; you can redistribute it and/or -;; modify it under the terms of the GNU Lesser General Public -;; License as published by the Free Software Foundation; either -;; version 2 of the License, or (at your option) any later version. +;; Permission is hereby granted, free of charge, to any person obtaining +;; a copy of this software and associated documentation files (the +;; "Software"), to deal in the Software without restriction, including +;; without limitation the rights to use, copy, modify, merge, publish, +;; distribute, sublicense, and/or sell copies of the Software, and to +;; permit persons to whom the Software is furnished to do so, subject to +;; the following conditions: ;; -;; This library is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; Lesser General Public License for more details. +;; The above copyright notice and this permission notice shall be +;; included in all copies or substantial portions of the Software. ;; -;; You should have received a copy of the GNU Lesser General Public -;; License along with this library; if not, write to the Free Software -;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gtk.lisp,v 1.31 2005-01-13 00:17:55 espen Exp $ +;; $Id: gtk.lisp,v 1.58 2006-02-27 12:26:47 espen Exp $ (in-package "GTK") @@ -39,28 +44,65 @@ (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 () (copy-of pango:language)) +(defun clg-version () + "clg 0.92") ;;;; Initalization -(defbinding (gtk-init "gtk_parse_args") () nil +(defbinding (gtk-init "gtk_parse_args") () boolean "Initializes the library without opening the display." (nil null) (nil null)) (defun clg-init (&optional display) "Initializes the system and starts the event handling" + #+sbcl(when (and + (find-package "SWANK") + (eq (symbol-value (find-symbol "*COMMUNICATION-STYLE*" "SWANK")) :spawn)) + (error "When running clg in Slime the communication style :spawn can not be used. See the README file and for more information.")) + (unless (gdk:display-get-default) (gdk:gdk-init) - (gtk-init) + (unless (gtk-init) + (error "Initialization of GTK+ failed.")) (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)))) + (add-fd-handler (gdk:display-connection-number) :input #'main-iterate-all) + (setq *periodic-polling-function* #'main-iterate-all) + (setq *max-event-to-sec* 0) + (setq *max-event-to-usec* 1000)))) + + +;;; Misc + +(defbinding grab-add () nil + (widget widget)) + +(defbinding grab-get-current () widget) + +(defbinding grab-remove () nil + (widget widget)) + +(defbinding get-default-language () (copy-of pango:language)) + + +;;; About dialog + +#+gtk2.6 +(progn + (define-callback-marshal %about-dialog-activate-link-callback nil + (about-dialog (link string))) + + (defbinding about-dialog-set-email-hook (function) nil + (%about-dialog-activate-link-callback callback) + ((register-callback-function function) unsigned-int) + (user-data-destroy-callback callback)) + + (defbinding about-dialog-set-url-hook (function) nil + (%about-dialog-activate-link-callback callback) + ((register-callback-function function) unsigned-int) + (user-data-destroy-callback callback))) ;;; Acccel group @@ -73,7 +115,7 @@ (defbinding %accel-group-connect () nil (gclosure gclosure)) (defun accel-group-connect (group accelerator function &optional flags) - (multiple-value-bind (key modifiers) (accelerator-parse accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) (let ((gclosure (make-callback-closure function))) (%accel-group-connect group key modifiers flags gclosure) gclosure))) @@ -96,28 +138,51 @@ (defun accel-group-disconnect (group accelerator) (etypecase accelerator (gclosure (%accel-group-disconnect group accelerator)) (string - (multiple-value-bind (key modifiers) (accelerator-parse accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) (%accel-group-disconnect-key group key modifiers))))) +(defbinding %accel-group-query () (copy-of (vector (inlined accel-group-entry) n)) + (accel-group accel-group) + (key unsigned-int) + (modifiers gdk:modifier-type) + (n int :out)) + +(defun accel-group-query (accel-group accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) + (%accel-group-query accel-group key modifiers))) + +(defbinding %accel-group-activate () boolean + (accel-group accel-group) + (acceleratable gobject) + (key unsigned-int) + (modifiers gdk:modifier-type)) + +(defun accel-group-activate (accel-group acceleratable accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) + (%accel-group-activate accel-group acceleratable key modifiers))) + (defbinding accel-group-lock () nil (accel-group accel-group)) (defbinding accel-group-unlock () nil (accel-group accel-group)) +(defbinding accel-group-from-accel-closure () accel-group + (closure gclosure)) + (defbinding %accel-groups-activate () boolean (object gobject) (key unsigned-int) (modifiers gdk:modifier-type)) (defun accel-groups-activate (object accelerator) - (multiple-value-bind (key modifiers) (accelerator-parse accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) (%accel-groups-activate object key modifiers))) (defbinding accel-groups-from-object () (gslist accel-groups) (object gobject)) -(defbinding accelerator-valid-p (key &optional mask) boolean +(defbinding accelerator-valid-p (key &optional modifiers) boolean (key unsigned-int) (modifiers gdk:modifier-type)) @@ -126,12 +191,35 @@ (defbinding %accelerator-parse () nil (key unsigned-int :out) (modifiers gdk:modifier-type :out)) -(defun accelerator-parse (accelerator) +(defgeneric parse-accelerator (accelerator)) + +(defmethod parse-accelerator ((accelerator string)) (multiple-value-bind (key modifiers) (%accelerator-parse accelerator) (if (zerop key) (error "Invalid accelerator: ~A" accelerator) (values key modifiers)))) +(defmethod parse-accelerator ((accelerator cons)) + (destructuring-bind (key modifiers) accelerator + (values + (etypecase key + (integer key) + (string + (or + (gdk:keyval-from-name key) + (error "Invalid key name: ~A" key))) + (character (parse-accelerator key))) + modifiers))) + +(defmethod parse-accelerator ((key integer)) + key) + +(defmethod parse-accelerator ((key character)) + (or + (gdk:keyval-from-name (string key)) + (error "Invalid key name: ~A" key))) + + (defbinding accelerator-name () string (key unsigned-int) (modifiers gdk:modifier-type)) @@ -152,6 +240,9 @@ (defbinding (accelerator-default-modifier-mask "gtk_accelerator_get_default_mod_ ;;; Acccel label +(defbinding accel-label-get-accel-width () unsigned-int + (accel-label accel-label)) + (defbinding accel-label-refetch () boolean (accel-label accel-label)) @@ -159,18 +250,28 @@ (defbinding accel-label-refetch () boolean ;;; Accel map +(defbinding (accel-map-init "_gtk_accel_map_init") () nil) + (defbinding %accel-map-add-entry () nil (path string) (key unsigned-int) (modifiers gdk:modifier-type)) (defun accel-map-add-entry (path accelerator) - (multiple-value-bind (key modifiers) (accelerator-parse accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) (%accel-map-add-entry path key modifiers))) -(defbinding accel-map-lookup-entry () boolean +(defbinding %accel-map-lookup-entry () boolean (path string) - (key pointer)) ;accel-key)) + ((make-instance 'accel-key) accel-key :return)) + +(defun accel-map-lookup-entry (path) + (multiple-value-bind (found-p accel-key) (%accel-map-lookup-entry path) + (when found-p + (values + (slot-value accel-key 'key) + (slot-value accel-key 'modifiers) + (slot-value accel-key 'flags))))) (defbinding %accel-map-change-entry () boolean (path string) @@ -179,7 +280,7 @@ (defbinding %accel-map-change-entry () boolean (replace boolean)) (defun accel-map-change-entry (path accelerator &optional replace) - (multiple-value-bind (key modifiers) (accelerator-parse accelerator) + (multiple-value-bind (key modifiers) (parse-accelerator accelerator) (%accel-map-change-entry path key modifiers replace))) (defbinding accel-map-load () nil @@ -188,6 +289,27 @@ (defbinding accel-map-load () nil (defbinding accel-map-save () nil (filename pathname)) +(define-callback-marshal %accel-map-foreach-callback nil + ((accel-path string) (key unsigned-int) + (modifiers gdk:modifier-type) (changed boolean)) :callback-id :first) + +(defbinding %accel-map-foreach (callback-id) nil + (callback-id unsigned-int) + (%accel-map-foreach-callback callback)) + +(defbinding %accel-map-foreach-unfiltered (callback-id) nil + (callback-id unsigned-int) + (%accel-map-foreach-callback callback)) + +(defun accel-map-foreach (function &optional (filter-p t)) + (with-callback-function (id function) + (if filter-p + (%accel-map-foreach id) + (%accel-map-foreach-unfiltered id)))) + +(defbinding accel-map-add-filter () nil + (filter string)) + (defbinding accel-map-get () accel-map) (defbinding accel-map-lock-path () nil @@ -198,7 +320,7 @@ (defbinding accel-map-unlock-path () nil -;;; Accessible +;;; Accessibility (defbinding accessible-connect-widget-destroyed () nil (accessible accessible)) @@ -262,8 +384,9 @@ (defun (setf bin-child) (child bin) (container-add bin child) child) -(defmethod create-callback-function ((bin bin) function arg1) - (if (eq arg1 :child) +(defmethod compute-signal-function ((bin bin) signal function object) + (declare (ignore signal)) + (if (eq object :child) #'(lambda (&rest args) (apply function (bin-child bin) (rest args))) (call-next-method))) @@ -379,10 +502,6 @@ (defbinding check-menu-item-toggled () nil (check-menu-item check-menu-item)) - -;;; Clipboard - - ;;; Color selection (defbinding (color-selection-is-adjusting-p @@ -465,128 +584,140 @@ (defmethod shared-initialize ((dialog dialog) names &rest initargs (initial-apply-add dialog #'dialog-add-button initargs :button :buttons))) -(defun %dialog-find-response-id-num (dialog id &optional create-p error-p) - (or - (cadr (assoc id (rest (type-expand-1 'response-type)))) - (let ((response-ids (object-data dialog 'response-id-key))) - (cond - ((and response-ids (position id response-ids :test #'equal))) - (create-p +(defun dialog-response-id (dialog response &optional create-p error-p) + "Returns a numeric response id" + (if (typep response 'response-type) + (response-type-to-int response) + (let ((responses (object-data dialog 'responses))) + (cond + ((and responses (position response responses :test #'equal))) + (create-p (cond - (response-ids - (vector-push-extend id response-ids) - (1- (length response-ids))) + (responses + (vector-push-extend response responses) + (1- (length responses))) (t (setf - (object-data dialog 'response-id-key) - (make-array 1 :adjustable t :fill-pointer t :initial-element id)) + (object-data dialog 'responses) + (make-array 1 :adjustable t :fill-pointer t + :initial-element response)) 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 #'equal)) - (aref (object-data dialog 'response-id-key) response-id-num ))) - - -(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)) - ((call-next-method))))) + (error "Invalid response: ~A" response)))))) + +(defun dialog-find-response (dialog id) + "Finds a symbolic response given a numeric id" + (if (< id 0) + (int-to-response-type id) + (aref (object-data dialog 'responses) id))) + +(defmethod compute-signal-id ((dialog dialog) signal) + (if (dialog-response-id dialog signal) + (ensure-signal-id 'response dialog) + (call-next-method))) + +(defmethod compute-signal-function ((dialog dialog) signal function object) + (declare (ignore function object)) + (let ((callback (call-next-method)) + (id (dialog-response-id dialog signal))) + (if id + #'(lambda (dialog response) + (when (= response id) + (funcall callback dialog))) + callback))) (defbinding dialog-run () nil (dialog dialog)) -(defbinding dialog-response (dialog response-id) nil +(defbinding dialog-response (dialog response) nil (dialog dialog) - ((%dialog-find-response-id-num dialog response-id nil t) int)) + ((dialog-response-id dialog response nil t) int)) (defbinding %dialog-add-button () button (dialog dialog) (text string) - (response-id-num int)) + (response-id int)) (defun dialog-add-button (dialog label &optional (response label) &key default object after) "Adds a button to the dialog." - (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))) + (let* ((signal (if (functionp response) + label + response)) + (id (dialog-response-id dialog signal t)) + (button (%dialog-add-button dialog label id))) (when (functionp response) - (signal-connect dialog id response :object object :after after)) + (signal-connect dialog signal response :object object :after after)) (when default - (%dialog-set-default-response dialog id-num)) + (%dialog-set-default-response dialog id)) button)) -(defbinding %dialog-add-action-widget () button +(defbinding %dialog-add-action-widget () nil (dialog dialog) (action-widget widget) - (response-id-num int)) + (response-id int)) (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) + (let* ((signal (if (functionp response) + widget + response)) + (id (dialog-response-id dialog signal t))) + (unless (widget-hidden-p widget) + (widget-show widget)) + (%dialog-add-action-widget dialog widget id) (when (functionp response) - (signal-connect dialog id response :object object :after after)) + (signal-connect dialog signal response :object object :after after)) (when default - (%dialog-set-default-response dialog id-num)) + (%dialog-set-default-response dialog id)) widget)) (defbinding %dialog-set-default-response () nil (dialog dialog) - (response-id-num int)) + (response-id int)) -(defun dialog-set-default-response (dialog response-id) +(defun dialog-set-default-response (dialog response) (%dialog-set-default-response - dialog (%dialog-find-response-id-num dialog response-id nil t))) + dialog (dialog-response-id dialog response nil t))) -(defbinding dialog-set-response-sensitive (dialog response-id sensitive) nil +(defbinding dialog-set-response-sensitive (dialog response sensitive) nil (dialog dialog) - ((%dialog-find-response-id-num dialog response-id nil t) int) + ((dialog-response-id dialog response nil t) int) (sensitive boolean)) #+gtk2.6 -(defbinding alternative-dialog-button-order-p(&optional screen) - (screen (or null screen))) +(defbinding alternative-dialog-button-order-p (&optional screen) boolean + (screen (or null gdk:screen))) #+gtk2.6 (defbinding (dialog-set-alternative-button-order - "gtk_dialog_set_alternative_button_order_from_array") - (dialog new-order) + "gtk_dialog_set_alternative_button_order_from_array") + (dialog new-order) nil (dialog dialog) ((length new-order) int) - ((map 'vector #'(lambda (id) - (%dialog-find-response-id-num dialog id nil t)) + ((map 'vector #'(lambda (response) + (dialog-response-id dialog response nil t)) new-order) (vector int))) +#+gtk2.8 +(progn + (defbinding %dialog-get-response-for-widget () int + (dialog dialog) + (widget widget)) + + (defun dialog-get-response-for-widget (dialog widget) + (dialog-find-response dialog (dialog-get-response-for-widget dialog widget)))) + + (defmethod container-add ((dialog dialog) (child widget) &rest args) (apply #'container-add (dialog-vbox dialog) child args)) + (defmethod container-remove ((dialog dialog) (child widget)) (container-remove (dialog-vbox dialog) child)) @@ -615,14 +746,14 @@ (defbinding entry-text-index-to-layout-index () int ;;; Entry Completion -(def-callback-marshal %entry-completion-match-func - (boolean entry-completion string (copy-of tree-iter))) +(define-callback-marshal %entry-completion-match-callback boolean + (entry-completion string tree-iter)) (defbinding entry-completion-set-match-func (completion function) nil (completion entry-completion) - ((callback %entry-completion-match-func) pointer) + (%entry-completion-match-callback callback) ((register-callback-function function) unsigned-int) - ((callback %destroy-user-data) pointer)) + (user-data-destroy-callback callback)) (defbinding entry-completion-complete () nil (completion entry-completion)) @@ -757,17 +888,16 @@ (defbinding file-filter-add-pattern () nil #+gtk2.6 (defbinding file-filter-add-pixbuf-formats () nil - (filter file-filter) - (pattern string)) + (filter file-filter)) -(def-callback-marshal %file-filter-func (boolean file-filter-info)) +(define-callback-marshal %file-filter-callback boolean (file-filter-info)) -(defbinding file-filter-add-custom () nil +(defbinding file-filter-add-custom (filter needed function) nil (filter file-filter) (needed file-filter-flags) - ((callback %file-filter-func) pointer) + (%file-filter-callback callback) ((register-callback-function function) unsigned-int) - ((callback %destroy-user-data) pointer)) + (user-data-destroy-callback callback)) (defbinding file-filter-get-needed () file-filter-flags (filter file-filter)) @@ -808,6 +938,11 @@ (defun create-image-widget (source &optional mask) ((or list vector) (make-instance 'image :pixmap source)) (gdk:pixmap (make-instance 'image :pixmap source :mask mask)))) +#+gtk2.8 +(defbinding image-clear () nil + (image image)) + + ;;; Image menu item @@ -826,6 +961,12 @@ (defmethod (setf image-menu-item-image) (image (item image-menu-item)) ;;; Label +(defmethod shared-initialize ((label label) names &key pattern) + (declare (ignore names)) + (call-next-method) + (when pattern + (setf (label-pattern label) pattern))) + (defbinding label-get-layout-offsets () nil (label label) (x int :out) @@ -856,6 +997,25 @@ (defmethod add-to-radio-group ((button1 radio-button) (button2 radio-button)) "Add BUTTON1 to the group which BUTTON2 belongs to." (%radio-button-set-group button1 (%radio-button-get-group button2))) +(defun %add-activate-callback (widget signal function object after) + (if object + (signal-connect widget signal + #'(lambda (object) + (when (slot-value widget 'active) + (funcall function object (slot-value widget 'value)))) + :object object :after after) + (signal-connect widget signal + #'(lambda () + (when (slot-value widget 'active) + (funcall function (slot-value widget 'value)))) + :after after))) + +(defmethod activate-radio-widget ((button radio-button)) + (signal-emit button 'clicked)) + +(defmethod add-activate-callback ((button radio-button) function &key object after) + (%add-activate-callback button 'clicked function object after)) + (defmethod initialize-instance ((button radio-button) &key group) (prog1 (call-next-method) @@ -925,7 +1085,7 @@ (defbinding menu-item-toggle-size-allocate () nil ;;; Menu tool button #+gtk2.6 -(defbinding menu-tool-button-set-arrow-tip () nil +(defbinding menu-tool-button-set-arrow-tooltip () nil (menu-tool-button menu-tool-button) (tooltips tooltips) (tip-text string) @@ -934,30 +1094,28 @@ (defbinding menu-tool-button-set-arrow-tip () nil ;;; Message dialog -(defmethod initialize-instance ((dialog message-dialog) &rest initargs - &key (type :info) (buttons :close) ; or :ok? - flags message parent) - (remf initargs :parent) - (setf - (slot-value dialog 'location) - (%message-dialog-new parent flags type buttons nil)) - (message-dialog-set-markup dialog message) - (apply #'call-next-method dialog initargs)) +(defmethod allocate-foreign ((dialog message-dialog) &key (message-type :info) + (buttons :close) flags transient-parent) + (%message-dialog-new transient-parent flags message-type buttons)) -(defbinding %message-dialog-new () pointer - (parent (or null window)) - (flags dialog-flags) - (type message-type) - (buttons buttons-type) - (message (or null string))) +(defmethod shared-initialize ((dialog message-dialog) names + &key text #+gtk 2.6 secondary-text) + (declare (ignore names)) + (when text + (message-dialog-set-markup dialog text)) + #+gtk2.6 + (when secondary-text + (message-dialog-format-secondary-markup dialog secondary-text)) + (call-next-method)) -(defbinding %message-dialog-new-with-markup () pointer + +(defbinding %message-dialog-new () pointer (parent (or null window)) (flags dialog-flags) (type message-type) (buttons buttons-type) - (message string)) + (nil null)) (defbinding message-dialog-set-markup () nil (message-dialog message-dialog) @@ -984,10 +1142,16 @@ (defbinding %radio-menu-item-set-group () nil (radio-menu-item radio-menu-item) (group pointer)) +(defmethod activate-radio-widget ((item radio-menu-item)) + (menu-item-activate item)) + (defmethod add-to-radio-group ((item1 radio-menu-item) (item2 radio-menu-item)) "Add ITEM1 to the group which ITEM2 belongs to." (%radio-menu-item-set-group item1 (%radio-menu-item-get-group item2))) +(defmethod add-activate-callback ((item radio-menu-item) function &key object after) + (%add-activate-callback item 'activate function object after)) + (defmethod initialize-instance ((item radio-menu-item) &key group) (prog1 (call-next-method) @@ -1005,22 +1169,14 @@ (defbinding %radio-tool-button-set-group () nil (radio-tool-button radio-tool-button) (group pointer)) +(defmethod activate-radio-widget ((button radio-tool-button)) + (signal-emit button 'clicked)) + (defmethod add-to-radio-group ((button1 radio-tool-button) (button2 radio-tool-button)) "Add BUTTON1 to the group which BUTTON2 belongs to." (%radio-tool-button-set-group button1 (%radio-tool-button-get-group button2))) - -(defmethod add-activate-callback ((widget widget) function &key object after) - (if object - (signal-connect widget 'clicked - #'(lambda (object) - (when (slot-value widget 'active) - (funcall function object (slot-value widget 'value)))) - :object object :after after) - (signal-connect widget 'clicked - #'(lambda () - (when (slot-value widget 'active) - (funcall function (slot-value widget 'value)))) - :after after))) +(defmethod add-activate-callback ((button radio-tool-button) function &key object after) + (%add-activate-callback button 'clicked function object after)) (defmethod initialize-instance ((button radio-tool-button) &key group) (prog1 @@ -1046,6 +1202,16 @@ (defmethod initialize-instance ((window window) &rest initargs (initial-add window #'window-add-accel-group initargs :accel-group :accel-groups))) +#-debug-ref-counting +(defmethod print-object ((window window) stream) + (if (and + (proxy-valid-p window) + (slot-boundp window 'title) + (not (zerop (length (window-title window))))) + (print-unreadable-object (window stream :type t :identity nil) + (format stream "~S at 0x~X" + (window-title window) (sap-int (foreign-location window)))) + (call-next-method))) (defbinding window-set-wmclass () nil (window window) @@ -1133,9 +1299,24 @@ (defbinding window-propagate-key-event () boolean (window window) (event gdk:key-event)) +#-gtk2.8 (defbinding window-present () nil (window window)) +#+gtk2.8 +(progn + (defbinding %window-present () nil + (window window)) + + (defbinding %window-present-with-time () nil + (window window) + (timespamp unsigned-int)) + + (defun window-present (window &optional timestamp) + (if timestamp + (%window-present-with-time window timestamp) + (%window-present window)))) + (defbinding window-iconify () nil (window window)) @@ -1199,7 +1380,7 @@ (defbinding window-get-frame-dimensions () nil (window window) (left int :out) (top int :out) (rigth int :out) (bottom int :out)) -(defbinding %window-get-icon-list () (glist gdk:pixbuf) +(defbinding %window-get-icon-list () (glist (copy-of gdk:pixbuf)) (window window)) (defbinding window-get-position () nil @@ -1321,12 +1502,12 @@ (defbinding scrolled-window-add-with-viewport () nil (scrolled-window scrolled-window) (child widget)) -(defmethod initialize-instance ((window scrolled-window) &rest initargs - &key policy) - (if policy - (apply #'call-next-method window - :vscrollbar-policy policy :hscrollbar-policy policy initargs) - (call-next-method))) +(defmethod shared-initialize ((window scrolled-window) names &key policy) + (declare (ignore names)) + (when policy + (setf (slot-value window 'hscrollbar-policy) policy) + (setf (slot-value window 'vscrollbar-policy) policy)) + (call-next-method)) ;;; Statusbar @@ -1419,7 +1600,7 @@ (defbinding notebook-prev-page () nil (defbinding notebook-reorder-child (notebook child position) nil (notebook notebook) (child widget) - ((%notebook-position notebook position) int)) + ((%ensure-notebook-position notebook position) int)) (defbinding notebook-popup-enable () nil (notebook notebook)) @@ -1486,7 +1667,7 @@ (defun (setf notebook-menu-label) (menu-label notebook page) (defbinding notebook-query-tab-label-packing (notebook page) nil (notebook notebook) - ((%notebook-child notebook page) widget) + ((%ensure-notebook-child notebook page) widget) (expand boolean :out) (fill boolean :out) (pack-type pack-type :out)) @@ -1494,7 +1675,7 @@ (defbinding notebook-query-tab-label-packing (notebook page) nil (defbinding notebook-set-tab-label-packing (notebook page expand fill pack-type) nil (notebook notebook) - ((%notebook-child notebook page) widget) + ((%ensure-notebook-child notebook page) widget) (expand boolean) (fill boolean) (pack-type pack-type)) @@ -1605,13 +1786,14 @@ (defbinding menu-attach () nil (top-attach unsigned-int) (bottom-attach unsigned-int)) -(def-callback-marshal %menu-position-func (nil (menu menu) (x int) (y int) (push-in boolean))) +(define-callback-marshal %menu-position-callback nil + (menu (x int) (y int) (push-in boolean))) (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 (or null callback)) (callback-id unsigned-int) (button unsigned-int) (activate-time (unsigned 32))) @@ -1622,7 +1804,7 @@ (defun menu-popup (menu button activate-time &key callback parent-menu-shell (with-callback-function (id callback) (%menu-popup menu parent-menu-shell parent-menu-item - (callback %menu-position-func) id button activate-time)) + %menu-position-callback id button activate-time)) (%menu-popup menu parent-menu-shell parent-menu-item nil 0 button activate-time))) @@ -1650,13 +1832,13 @@ (defun (setf menu-active) (menu child) (%menu-set-active menu (%menu-position menu child)) child) -(defcallback %menu-detach-func (nil (widget widget) (menu menu)) +(define-callback %menu-detach-callback nil ((widget widget) (menu menu)) (funcall (object-data menu 'detach-func) widget menu)) -(defbinding %menu-attach-to-widget () nil +(defbinding %menu-attach-to-widget (menu widget) nil (menu menu) (widget widget) - ((callback %menu-detach-func) pointer)) + (%menu-detach-callback callback)) (defun menu-attach-to-widget (menu widget function) (setf (object-data menu 'detach-func) function) @@ -1871,7 +2053,7 @@ (defbinding editable-insert-text (editable text &optional (position 0)) nil (editable editable) (text string) ((length text) int) - (position position-type :in-out)) + (position position :in-out)) (defun editable-append-text (editable text) (editable-insert-text editable text nil)) @@ -1933,10 +2115,16 @@ (defbinding spin-button-get-range () nil (defun spin-button-value-as-int (spin-button) (round (spin-button-value spin-button))) -(defbinding spin-button-spin () nil +(defbinding %spin-button-spin () nil (spin-button spin-button) (direction spin-type) - (increment single-float)) + (increment double-float)) + +(defun spin-button-spin (spin-button value) + (etypecase value + (real (%spin-button-spin spin-button :spin-user-defined value)) + (spin-type (%spin-button-spin spin-button value 0)))) + (defbinding spin-button-update () nil (spin-button spin-button)) @@ -2057,13 +2245,22 @@ (defbinding %stock-lookup () boolean (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)))) + (with-allocated-memory (stock-item (foreign-size (find-class 'stock-item))) + (when (%stock-lookup stock-id stock-item) + (ensure-proxy-instance 'stock-item (%stock-item-copy stock-item))))) + +#+gtk2.8 +(progn + (define-callback-marshal %stock-translate-callback string ((path string))) + (defbinding (stock-set-translate-function "gtk_stock_set_translate_func") + (domain function) nil + (domain string) + (%stock-translate-callback callback) + ((register-callback-function function) unsigned-int) + (user-data-destroy-callback callback))) + + ;;; Tooltips @@ -2096,18 +2293,66 @@ (defbinding tooltips-get-info-from-tip-window () boolean (current-widget widget :out)) -;;; Rc +;;; Resource Files -(defbinding rc-add-default-file (filename) nil - ((namestring (truename filename)) string)) +(defbinding rc-get-style () style + (widget widget)) -(defbinding rc-parse (filename) nil - ((namestring (truename filename)) string)) +(defbinding rc-get-style-by-paths (&key path class-path class) style + (path (or null string)) + (class-path (or null string)) + (class gtype)) + +(defbinding rc-parse () nil + (filename pathname)) (defbinding rc-parse-string () nil (rc-string string)) -(defbinding rc-reparse-all () nil) +(defbinding %rc-reparse-all () boolean) -(defbinding rc-get-style () style - (widget widget)) +(defbinding %rc-reparse-all-for-settings () boolean + (settings settings) + (force-load-p boolean)) + +(defun rc-reparse-all (&optional setting force-load-p) + (if setting + (%rc-reparse-all-for-settings setting force-load-p) + (%rc-reparse-all))) + +(defbinding rc-reset-styles () nil + (settings settings)) + +(defbinding rc-add-default-file () nil + (filename pathname)) + +(defbinding rc-get-default-files () + (copy-of (null-terminated-vector (copy-of string)))) + +(defbinding rc-get-module-dir () string) + +(defbinding rc-get-im-module-path () string) + +(defbinding rc-get-im-module-file () string) + +(defbinding rc-get-theme-dir () string) + + +;;; Settings + +(defbinding (settings-get "gtk_settings_get_for_screen") + (&optional (screen (gdk:display-get-default-screen))) settings + (screen gdk:screen)) + + +;;; Plug and Socket + +(defbinding socket-add-id () nil + (socket socket) + (id gdk:native-window)) + +(defbinding %plug-new () pointer + (id gdk:native-window)) + +(defmethod allocate-foreign ((plug plug) &key id) + (%plug-new (or id 0)))