chiark / gitweb /
Changes required by SBCL
[clg] / gtk / gtkaction.lisp
1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 1999-2001 Espen S. Johnsen <esj@stud.cs.uit.no>
3 ;;
4 ;; This library is free software; you can redistribute it and/or
5 ;; modify it under the terms of the GNU Lesser General Public
6 ;; License as published by the Free Software Foundation; either
7 ;; version 2 of the License, or (at your option) any later version.
8 ;;
9 ;; This library is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;; Lesser General Public License for more details.
13 ;;
14 ;; You should have received a copy of the GNU Lesser General Public
15 ;; License along with this library; if not, write to the Free Software
16 ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18 ;; $Id: gtkaction.lisp,v 1.3 2005-02-03 23:09:09 espen Exp $
19
20
21 (in-package "GTK")
22
23 ;;; Action
24
25 (defmethod initialize-instance ((action action) &key accelerator)
26   (call-next-method)
27   (setf (object-data action 'accelerator) accelerator))
28
29 (defmethod action-accelerator ((action action))
30   (object-data action 'accelerator))
31
32 (defbinding (action-is-sensitive-p "gtk_action_is_sensitive") () boolean
33   (action action))
34
35 (defbinding (action-is-visible-p "gtk_action_is_visible") () boolean
36   (action action))
37
38 (defbinding action-activate () nil
39   (action action))
40
41
42 ;;; Action Group
43
44 (defmethod initialize-instance ((action-group action-group) &rest initargs 
45                                 &key action actions)
46   (declare (ignore action actions))
47   (prog1
48       (call-next-method)
49     (initial-add action-group #'action-group-add-action 
50      initargs :action :actions)))
51
52 (defbinding action-group-get-action () action
53   (action-group action-group)
54   (name string))
55
56 (defbinding action-group-list-actions () (glist action)
57   (action-group action-group))
58
59 (defbinding %action-group-add-action () nil
60   (action-group action-group)
61   (action action))
62
63 (defbinding %action-group-add-action-with-accel () nil
64   (action-group action-group)
65   (action action)
66   (accelerator (or null string)))
67
68 (defun action-group-add-action (action-group action)
69   (multiple-value-bind (accelerator accelerator-p) 
70       (object-data action 'accelerator)
71     (if accelerator-p
72         (%action-group-add-action-with-accel action-group action accelerator)
73       (%action-group-add-action action-group action))))
74
75 (defbinding action-group-remove-action () nil
76   (action-group action-group)
77   (action action))
78
79
80 ;;; Radio Action
81
82 (defmethod initialize-instance ((action radio-action) &key group value)
83   (call-next-method)
84   (setf (slot-value action '%value) (sap-int (proxy-location action)))
85   (setf (object-data action 'radio-action-value) value)
86   (when group
87     (radio-action-add-to-group action group)))
88
89 (defmethod radio-value-action ((action radio-action))
90   (object-data action 'radio-action-value))
91
92 (defbinding %radio-action-get-group () pointer
93   (radio-action radio-action))
94
95 (defbinding %radio-action-set-group () nil
96   (radio-button radio-button)
97   (group pointer))
98
99 (defun radio-action-add-to-group (action1 action2)
100   "Add ACTION1 to the group which ACTION2 belongs to."
101   (%radio-action-set-group action1 (%radio-action-get-group action2)))
102
103 (defbinding (radio-action-get-current "gtk_radio_action_get_current_value") 
104     () radio-action
105   (radio-action radio-action))
106
107 (defun radio-action-get-current-value (action)
108   (radio-value-action (radio-action-get-current action)))
109
110
111
112 ;;; Toggle Action
113
114 (defbinding toggle-action-toggled () nil
115   (toggle-action toggle-action))
116
117
118
119 ;;; UI Manager
120
121 (defmethod initialize-instance ((ui-manager ui-manager) &rest initargs 
122                                 &key ui action-group)
123   (declare (ignore ui action-group))
124   (call-next-method)
125   (mapc #'(lambda (action-group)
126             (ui-manager-insert-action-group ui-manager action-group))
127         (get-all initargs :action-group))
128   (mapc #'(lambda (ui)
129             (ui-manager-add-ui ui-manager ui))
130         (get-all initargs :ui)))
131
132
133 (defbinding ui-manager-insert-action-group 
134     (ui-manager action-group &optional (pos :end)) nil
135   (ui-manager ui-manager)
136   (action-group action-group)
137   ((case pos
138      (:first 0)
139      (:end -1)
140      (t pos)) int))
141
142 (defbinding ui-manager-remove-action-group () nil
143   (ui-manager ui-manager)
144   (action-group action-group))
145
146 (defbinding ui-manager-get-widget () widget
147   (ui-manager ui-manager)
148   (path string))
149
150 (defbinding ui-manager-get-toplevels () (glist widget)
151   (ui-manager ui-manager)
152   (types ui-manager-item-type))
153
154 (defbinding ui-manager-get-action () action
155   (ui-manager ui-manager)
156   (path string))
157
158 (defbinding %ui-manager-add-ui-from-string (ui-manager ui) int
159   (ui-manager ui-manager)
160   (ui string)
161   ((length ui) int)
162   (gerror pointer :out))
163
164 (defmethod ui-manager-add-ui ((ui-manager ui-manager) (ui-spec string))
165   (let ((id (%ui-manager-add-ui-from-string ui-manager ui-spec)))
166     (when (zerop id)
167       (error "We need to handle GError in som way"))
168     id))
169
170 (defbinding %ui-manager-add-ui-from-file () int
171   (ui-manager ui-manager)
172   (filename pathname)
173   (gerror pointer :out))
174
175 (defmethod ui-manager-add-ui ((ui-manager ui-manager) (path pathname))
176   (let ((id (%ui-manager-add-ui-from-file ui-manager path)))
177     (when (zerop id)
178       (error "We need to handle GError in som way"))
179     id))
180
181 (defbinding %ui-manager-new-merge-id () unsigned-int
182   (ui-manager ui-manager))
183
184 (defbinding %ui-manager-add-ui () nil
185   (ui-manager ui-manager)
186   (merge-id unsigned-int)
187   (path string)
188   (name string)
189   (action (or null string))
190   (type ui-manager-item-type)
191   (top boolean))
192
193 (defvar *valid-ui-elements*
194   '((:ui :menubar :toolbar :popup :accelerator)
195     (:menubar :menuitem :separator :placeholder :menu)
196     (:menu :menuitem :separator :placehoder :menu)
197     (:popup :menuitem :separator :placehoder :menu)
198     (:toolbar :toolitem :separator :placehoder)
199     (:placeholder :menuitem :toolitem :separator :placeholder :menu)
200     (:menuitem)
201     (:toolitem)
202     (:separator)
203     (:accelerator)))
204
205 (defmethod ui-manager-add-ui ((ui-manager ui-manager) (ui-spec list))
206   (let ((id (%ui-manager-new-merge-id ui-manager)))
207     (labels 
208         ((parse-ui-spec (path ui-spec element)
209            (loop
210             for definition in ui-spec
211             do (destructuring-bind (type &optional name &rest rest)
212                    (mklist definition)
213                  (cond
214                   ((not (find type (cdr (assoc element *valid-ui-elements*))))
215                    (ui-manager-remove-ui ui-manager id)
216                    (error "~S not valid subelement in ~S" type element))
217                   ((multiple-value-bind (action children)
218                        (if (and rest (atom (first rest)) 
219                                 (not (keywordp (first rest))))
220                            (values (first rest) (rest rest))
221                          (values name rest))
222                      (%ui-manager-add-ui ui-manager id (or path "/") name action type nil)
223                      (when children
224                        (parse-ui-spec (concatenate 'string path "/" name) 
225                                       children type)))))))))
226       (parse-ui-spec nil ui-spec :ui))
227     id))
228
229 (defbinding ui-manager-remove-ui () nil
230   (ui-manager ui-manager)
231   (merge-id unsigned-int))
232   
233 (defbinding ui-manager-get-ui () string
234   (ui-manager ui-manager))
235
236 (defbinding ui-manager-ensure-update () nil
237   (ui-manager ui-manager))