Remove calls to release and using for GBoxed structures
[cl-gtk2.git] / gtk / gtk.text.lisp
1 (in-package :gtk)
2
3 ;; text iter
4
5
6 (define-foreign-type unichar ()
7   ()
8   (:actual-type :uint32)
9   (:simple-parser unichar))
10
11 (defmethod translate-from-foreign (value (type unichar))
12   (code-char value))
13
14 (defmethod translate-to-foreign (value (type unichar))
15   (char-code value))
16
17 (define-g-boxed-opaque text-iter "GtkTextIter"
18   :alloc (gtk-text-iter-alloc))
19
20 (define-boxed-opaque-accessor text-iter text-iter-buffer :reader "gtk_text_iter_get_buffer" :type (g-object text-buffer))
21 (define-boxed-opaque-accessor text-iter text-iter-offset :reader "gtk_text_iter_get_offset" :writer "gtk_text_iter_set_offset" :type :int)
22 (define-boxed-opaque-accessor text-iter text-iter-line :reader "gtk_text_iter_get_line" :writer "gtk_text_iter_set_line" :type :int)
23 (define-boxed-opaque-accessor text-iter text-iter-line-offset :reader "gtk_text_iter_get_line_offset" :writer "gtk_text_iter_set_line_offset" :type :int)
24 (define-boxed-opaque-accessor text-iter text-iter-visible-line-offset :reader "gtk_text_iter_get_visible_line_offset" :writer "gtk_text_iter_set_visible_line_offset" :type :int)
25 (define-boxed-opaque-accessor text-iter text-iter-char :reader "gtk_text_iter_get_char" :type unichar)
26 (define-boxed-opaque-accessor text-iter text-iter-pixbuf :reader "gtk_text_iter_get_pixbuf" :type (g-object pixbuf))
27 (define-boxed-opaque-accessor text-iter text-iter-marks :reader "gtk_text_iter_get_marks" :type (gslist (g-object text-mark) :free-from-foreign t))
28 (define-boxed-opaque-accessor text-iter text-iter-child-anchor :reader "gtk_text_iter_get_child_anchor" :type (g-object text-child-anchor))
29 (define-boxed-opaque-accessor text-iter text-iter-tags :reader "gtk_text_iter_get_tags" :type (gslist (g-object text-tag) :free-from-foreign t))
30 (define-boxed-opaque-accessor text-iter text-iter-chars-in-line :reader "gtk_text_iter_get_chars_in_line" :type :int)
31 (define-boxed-opaque-accessor text-iter text-iter-language :reader "gtk_text_iter_get_language" :type :pointer)
32 (define-boxed-opaque-accessor text-iter text-iter-is-end :reader "gtk_text_iter_is_end" :type :boolean)
33 (define-boxed-opaque-accessor text-iter text-iter-is-start :reader "gtk_text_iter_is_start" :type :boolean)
34 (define-boxed-opaque-accessor text-iter text-iter-can-insert :reader "gtk_text_iter_can_insert" :type :boolean)
35 (define-boxed-opaque-accessor text-iter text-iter-starts-word :reader "gtk_text_iter_starts_word" :type :boolean)
36 (define-boxed-opaque-accessor text-iter text-iter-ends-word :reader "gtk_text_iter_ends_word" :type :boolean)
37 (define-boxed-opaque-accessor text-iter text-iter-inside-word :reader "gtk_text_iter_inside_word" :type :boolean)
38 (define-boxed-opaque-accessor text-iter text-iter-starts-line :reader "gtk_text_iter_starts_line" :type :boolean)
39 (define-boxed-opaque-accessor text-iter text-iter-ends-line :reader "gtk_text_iter_ends_line" :type :boolean)
40 (define-boxed-opaque-accessor text-iter text-iter-starts-sentence :reader "gtk_text_iter_starts_sentence" :type :boolean)
41 (define-boxed-opaque-accessor text-iter text-iter-ends-sentence :reader "gtk_text_iter_ends_sentence" :type :boolean)
42 (define-boxed-opaque-accessor text-iter text-iter-inside-sentence :reader "gtk_text_iter_inside_sentence" :type :boolean)
43 (define-boxed-opaque-accessor text-iter text-iter-is-cursor-position :reader "gtk_text_iter_is_cursor_position" :type :boolean)
44
45 (export (boxed-related-symbols 'text-iter))
46 (export '(text-iter-buffer text-iter-offset text-iter-line
47           text-iter-line-offset text-iter-visible-line-offset
48           text-iter-char text-iter-pixbuf text-iter-marks
49           text-iter-child-anchor text-iter-tags
50           text-iter-chars-in-line text-iter-language text-iter-is-end
51           text-iter-is-start text-iter-can-insert
52           text-iter-starts-word text-iter-ends-word
53           text-iter-inside-word text-iter-starts-line
54           text-iter-ends-line text-iter-starts-sentence
55           text-iter-ends-sentence text-iter-inside-sentence
56           text-iter-is-cursor-position ))
57
58 (defcstruct %text-iter
59   (dummy1 :pointer)
60   (dummy2 :pointer)
61   (dummy3 :int)
62   (dummy4 :int)
63   (dummy5 :int)
64   (dummy6 :int)
65   (dummy7 :int)
66   (dummy8 :int)
67   (dummy9 :pointer)
68   (dummy10 :pointer)
69   (dummy11 :int)
70   (dummy12 :int)
71   (dummy13 :int)
72   (dummy14 :pointer))
73
74 (defcfun gtk-text-iter-copy :pointer
75   (iter :pointer))
76
77 (defun gtk-text-iter-alloc ()
78   (with-foreign-object (iter '%text-iter)
79     (gtk-text-iter-copy iter)))
80
81 (defcfun (text-iter-slice "gtk_text_iter_get_slice") (:string :free-from-foreign t)
82   (start (g-boxed-foreign text-iter))
83   (end (g-boxed-foreign text-iter)))
84
85 (export 'text-iter-slice)
86
87 (defcfun (text-iter-text "gtk_text_iter_get_text") (:string :free-from-foreign t)
88   (start (g-boxed-foreign text-iter))
89   (end (g-boxed-foreign text-iter)))
90
91 (export 'text-iter-text)
92
93 (defcfun (text-iter-visible-slice "gtk_text_iter_get_visible_slice") (:string :free-from-foreign t)
94   (start (g-boxed-foreign text-iter))
95   (end (g-boxed-foreign text-iter)))
96
97 (export 'text-iter-visible-slice)
98
99 (defcfun (text-iter-visible-text "gtk_text_iter_get_visible_text") (:string :free-from-foreign t)
100   (start (g-boxed-foreign text-iter))
101   (end (g-boxed-foreign text-iter)))
102
103 (export 'text-iter-visible-text)
104
105 (defcfun (text-iter-toggled-tags "gtk_text_iter_get_toggled_tags") (gslist (g-object text-tag))
106   (iter (g-boxed-foreign text-iter))
107   (toggled-on :boolean))
108
109 (export 'text-iter-toggled-tags)
110
111 (defcfun (text-iter-begins-tag "gtk_text_iter_begins_tag") :boolean
112   (iter (g-boxed-foreign text-iter))
113   (tag (g-object text-tag)))
114
115 (export 'text-iter-begins-tag)
116
117 (defcfun (text-iter-ends-tag "gtk_text_iter_ends_tag") :boolean
118   (iter (g-boxed-foreign text-iter))
119   (tag (g-object text-tag)))
120
121 (export 'text-iter-ends-tag)
122
123 (defcfun (text-iter-toggles-tag "gtk_text_iter_toggles_tag") :boolean
124   (iter (g-boxed-foreign text-iter))
125   (tag (g-object text-tag)))
126
127 (export 'text-iter-toggles-tag)
128
129 (defcfun (text-iter-has-tag "gtk_text_iter_has_tag") :boolean
130   (iter (g-boxed-foreign text-iter))
131   (tag (g-object text-tag)))
132
133 (export 'text-iter-has-tag)
134
135 (defcfun (text-iter-editable "gtk_text_iter_editable") :boolean
136   (iter (g-boxed-foreign text-iter))
137   (default :boolean))
138
139 (export 'text-iter-editable)
140
141 (defcfun gtk-text-iter-get-attributes :boolean
142   (iter (g-boxed-foreign text-iter))
143   (values (g-object text-attributes)))
144
145 (defun text-iter-attributes (iter default-attributes)
146   (let ((changed-p (gtk-text-iter-get-attributes iter default-attributes)))
147     (values default-attributes changed-p)))
148
149 (export 'text-iter-attributes)
150
151 (defcfun gtk-text-iter-forward-chars :boolean
152   (iter (g-boxed-foreign text-iter))
153   (count :int))
154
155 (defcfun gtk-text-iter-forward-lines :boolean
156   (iter (g-boxed-foreign text-iter))
157   (count :int))
158
159 (defcfun gtk-text-iter-forward-word-ends :boolean
160   (iter (g-boxed-foreign text-iter))
161   (count :int))
162
163 (defcfun gtk-text-iter-backward-word-starts :boolean
164   (iter (g-boxed-foreign text-iter))
165   (count :int))
166
167 (defcfun gtk-text-iter-forward-cursor-positions :boolean
168   (iter (g-boxed-foreign text-iter))
169   (count :int))
170
171 (defcfun gtk-text-iter-forward-sentence-ends :boolean
172   (iter (g-boxed-foreign text-iter))
173   (count :int))
174
175 (defcfun gtk-text-iter-backward-sentence-starts :boolean
176   (iter (g-boxed-foreign text-iter))
177   (count :int))
178
179 (defcfun gtk-text-iter-forward-visible-word-ends :boolean
180   (iter (g-boxed-foreign text-iter))
181   (count :int))
182
183 (defcfun gtk-text-iter-backward-visible-word-starts :boolean
184   (iter (g-boxed-foreign text-iter))
185   (count :int))
186
187 (defcfun gtk-text-iter-forward-visible-cursor-positions :boolean
188   (iter (g-boxed-foreign text-iter))
189   (count :int))
190
191 (defcfun gtk-text-iter-forward-visible-lines :boolean
192   (iter (g-boxed-foreign text-iter))
193   (count :int))
194
195 (defun text-iter-move (iter &key (count 1) (by :char) (direction :forward))
196   (assert (typep by '(member :char :line :word :cursor-position :sentence :visible-word :visible-line :visible-cursor-position)))
197   (assert (typep direction '(member :forward :backward)))
198   (when (and (member by '(:char :ine :cursor-position :visible-line :visible-cursor-position)) (eq direction :backward))
199     (setf count (- count)))
200   (ecase by
201     (:char (gtk-text-iter-forward-chars iter count))
202     (:line (gtk-text-iter-forward-lines iter count))
203     (:word (if (eq direction :forward)
204                (gtk-text-iter-forward-word-ends iter count)
205                (gtk-text-iter-backward-word-starts iter count)))
206     (:cursor-position (gtk-text-iter-forward-cursor-positions iter count))
207     (:sentence (if (eq direction :forward)
208                    (gtk-text-iter-forward-sentence-ends iter count)
209                    (gtk-text-iter-backward-sentence-starts iter count)))
210     (:visible-word (if (eq direction :forward)
211                        (gtk-text-iter-forward-visible-word-ends iter count)
212                        (gtk-text-iter-backward-visible-word-starts iter count)))
213     (:visible-line (gtk-text-iter-forward-visible-lines iter count))
214     (:visible-cursor-position (gtk-text-iter-forward-visible-cursor-positions iter count))))
215
216 (export 'text-iter-move)
217
218 (defcfun (text-iter-forward-to-end "gtk_text_iter_forward_to_end") :void
219   (iter (g-boxed-foreign text-iter)))
220
221 (export 'text-iter-forward-to-end)
222
223 (defcfun (text-iter-forward-to-line-end "gtk_text_iter_forward_to_line_end") :boolean
224   (iter (g-boxed-foreign text-iter)))
225
226 (export 'text-iter-forward-to-line-end)
227
228 (defcfun (text-iter-forward-to-tag-toggle "gtk_text_iter_forward_to_tag_toggle") :boolean
229   (iter (g-boxed-foreign text-iter))
230   (tag (g-object text-tag)))
231
232 (defcfun (text-iter-backward-to-tag-toggle "gtk_text_iter_backward_to_tag_toggle") :boolean
233   (iter (g-boxed-foreign text-iter))
234   (tag (g-object text-tag)))
235
236 (export '(text-iter-forward-to-tag-toggle text-iter-backward-to-tag-toggle))
237
238 (defcallback gtk-text-char-predicate :boolean ((char unichar) (user-data :pointer))
239   (let ((function (get-stable-pointer-value user-data)))
240     (funcall function char)))
241
242 (defcfun gtk-text-iter-forward-find-char :boolean
243   (iter (g-boxed-foreign text-iter))
244   (pred :pointer)
245   (user-data :pointer)
246   (limit (g-boxed-foreign text-iter)))
247
248 (defcfun gtk-text-iter-backward-find-char :boolean
249   (iter (g-boxed-foreign text-iter))
250   (pred :pointer)
251   (user-data :pointer)
252   (limit (g-boxed-foreign text-iter)))
253
254 (defun text-iter-find-char (iter predicate &key limit (direction :forward))
255   (assert (typep direction '(member :forward :backward)))
256   (with-stable-pointer (ptr predicate)
257     (if (eq direction :forward)
258         (gtk-text-iter-forward-find-char iter (callback gtk-text-char-predicate) ptr limit)
259         (gtk-text-iter-backward-find-char iter (callback gtk-text-char-predicate) ptr limit))))
260
261 (export 'text-iter-find-char)
262
263 (defcfun gtk-text-iter-forward-search :boolean
264   (iter (g-boxed-foreign text-iter))
265   (str (:string :free-to-foreign t))
266   (flags text-search-flags)
267   (match-start (g-boxed-foreign text-iter))
268   (match-end (g-boxed-foreign text-iter))
269   (limit (g-boxed-foreign text-iter)))
270
271 (defcfun gtk-text-iter-backward-search :boolean
272   (iter (g-boxed-foreign text-iter))
273   (str (:string :free-to-foreign t))
274   (flags text-search-flags)
275   (match-start (g-boxed-foreign text-iter))
276   (match-end (g-boxed-foreign text-iter))
277   (limit (g-boxed-foreign text-iter)))
278
279 (defun text-iter-search (start-position string &key flags limit (direction :forward))
280   (assert (typep direction '(member :forward :backward)))
281   (let ((i1 (make-instance 'text-iter))
282         (i2 (make-instance 'text-iter)))
283     (if (if (eq direction :forward)
284             (gtk-text-iter-forward-search start-position string flags i1 i2 limit)
285             (gtk-text-iter-backward-search start-position string flags i1 i2 limit))
286         (values t i1 i2)
287         (values nil nil nil))))
288
289 (export 'text-iter-search)
290
291 (defcfun (text-iter-equal "gtk_text_iter_equal") :boolean
292   (iter-1 (g-boxed-foreign text-iter))
293   (iter-2 (g-boxed-foreign text-iter)))
294
295 (export 'text-iter-equal)
296
297 (defcfun (text-iter-compare "gtk_text_iter_compare") :int
298   (iter-1 (g-boxed-foreign text-iter))
299   (iter-2 (g-boxed-foreign text-iter)))
300
301 (export 'text-iter-compare)
302
303 (defcfun (text-iter-in-range "gtk_text_iter_in_range") :boolean
304   (iter (g-boxed-foreign text-iter))
305   (start (g-boxed-foreign text-iter))
306   (end (g-boxed-foreign text-iter)))
307
308 (export 'text-iter-in-range)
309
310 (defcfun (text-iter-order "gtk_text_iter_order") :void
311   (iter-1 (g-boxed-foreign text-iter))
312   (iter-2 (g-boxed-foreign text-iter)))
313
314 (export 'text-iter-order)
315
316 ;; text mark
317
318 (defcfun (text-mark-visible "gtk_text_mark_get_visible") :boolean
319   (mark (g-object text-mark)))
320
321 (defcfun gtk-text-mark-set-visible :void
322   (mark (g-object text-mark))
323   (visible :boolean))
324
325 (defun (setf text-mark-visible) (new-value mark)
326   (gtk-text-mark-set-visible mark new-value))
327
328 (export 'text-mark-visible)
329
330 (defcfun (text-mark-deleted "gtk_text_mark_get_deleted") :boolean
331   (mark (g-object text-mark)))
332
333 (export 'text-mark-deleted)
334
335 (defcfun (text-mark-buffer "gtk_text_mark_get_buffer") (g-object text-buffer)
336   (mark (g-object text-mark)))
337
338 (export 'text-mark-buffer)
339
340 ;; text buffer
341
342 (defcfun (text-buffer-line-count "gtk_text_buffer_get_line_count") :int
343   (buffer (g-object text-buffer)))
344
345 (export 'text-buffer-line-count)
346
347 (defcfun (text-buffer-char-count "gtk_text_buffer_get_char_count") :int
348   (buffer (g-object text-buffer)))
349
350 (export 'text-buffer)
351
352 (defcfun gtk-text-buffer-insert :void
353   (buffer (g-object text-buffer))
354   (iter (g-boxed-foreign text-iter))
355   (text (:string :free-to-foreign t))
356   (len :int))
357
358 (defcfun gtk-text-buffer-insert-at-cursor :void
359   (buffer (g-object text-buffer))
360   (text (:string :free-to-foreign t))
361   (len :int))
362
363 (defcfun gtk-text-buffer-insert-interactive :boolean
364   (buffer (g-object text-buffer))
365   (iter (g-boxed-foreign text-iter))
366   (text (:string :free-to-foreign t))
367   (len :int)
368   (default-editable :boolean))
369
370 (defcfun gtk-text-buffer-insert-interactive-at-cursor :boolean
371   (buffer (g-object text-buffer))
372   (text (:string :free-to-foreign t))
373   (len :int)
374   (default-editable :boolean))
375
376 (defun text-buffer-insert (buffer text &key (position :cursor) (interactive nil) (default-editable t))
377   (assert (typep position '(or text-iter (member :cursor))))
378   (if interactive
379       (if (eq position :cursor)
380           (gtk-text-buffer-insert-interactive-at-cursor buffer text -1 default-editable)
381           (gtk-text-buffer-insert-interactive buffer position text -1 default-editable))
382       (progn (if (eq position :cursor)
383                  (gtk-text-buffer-insert-at-cursor buffer text -1)
384                  (gtk-text-buffer-insert buffer position text -1))
385              t)))
386
387 (export 'text-buffer-insert)
388
389 (defcfun gtk-text-buffer-insert-range :void
390   (buffer (g-object text-buffer))
391   (iter (g-boxed-foreign text-iter))
392   (range-start (g-boxed-foreign text-iter))
393   (range-end (g-boxed-foreign text-iter)))
394
395 (defcfun gtk-text-buffer-insert-range-interactive :boolean
396   (buffer (g-object text-buffer))
397   (iter (g-boxed-foreign text-iter))
398   (range-start (g-boxed-foreign text-iter))
399   (range-end (g-boxed-foreign text-iter))
400   (default-editable :boolean))
401
402 (defun text-buffer-insert-range (buffer position range-start range-end &key interactive default-editable)
403   (if interactive
404       (gtk-text-buffer-insert-range-interactive buffer position range-start range-end default-editable)
405       (progn (gtk-text-buffer-insert-range buffer position range-start range-end)
406              t)))
407
408 (export 'text-buffer-insert-range)
409
410 (defcfun gtk-text-buffer-delete :void
411   (buffer (g-object text-buffer))
412   (range-start (g-boxed-foreign text-iter))
413   (range-end (g-boxed-foreign text-iter)))
414
415 (defcfun gtk-text-buffer-delete-interactive :boolean
416   (buffer (g-object text-buffer))
417   (range-start (g-boxed-foreign text-iter))
418   (range-end (g-boxed-foreign text-iter))
419   (default-editable :boolean))
420
421 (defun text-buffer-delete (buffer range-start range-end &key interactive default-editable)
422   (if interactive
423       (gtk-text-buffer-delete-interactive buffer range-start range-end default-editable)
424       (progn (gtk-text-buffer-delete buffer range-start range-end)
425              t)))
426
427 (export 'text-buffer-delete)
428
429 (defcfun gtk-text-buffer-backspace :boolean
430   (buffer (g-object text-buffer))
431   (iter (g-boxed-foreign text-iter))
432   (interactive :boolean)
433   (default-editable :boolean))
434
435 (defun text-buffer-backspace (buffer position &key interactive default-editable)
436   (gtk-text-buffer-backspace buffer position interactive default-editable))
437
438 (export 'text-buffer-backspace)
439
440 (defcfun gtk-text-buffer-get-slice (:string :free-from-foreign t)
441   (buffer (g-object text-buffer))
442   (range-start (g-boxed-foreign text-iter))
443   (range-end (g-boxed-foreign text-iter))
444   (include-hidden-chars :boolean))
445
446 (defun text-buffer-slice (buffer range-start range-end &key include-hidden-chars)
447   (gtk-text-buffer-get-slice buffer range-start range-end include-hidden-chars))
448
449 (export 'text-buffer-slice)
450
451 (defcfun (text-buffer-insert-pixbuf "gtk_text_buffer_insert_pixbuf") :void
452   (buffer (g-object text-buffer))
453   (position (g-boxed-foreign text-iter))
454   (pixbuf (g-object pixbuf)))
455
456 (export 'text-buffer-insert-pixbuf)
457
458 (defcfun gtk-text-buffer-insert-child-anchor :void
459   (buffer (g-object text-buffer))
460   (iter (g-boxed-foreign text-iter))
461   (anchor (g-object text-child-anchor)))
462
463 (defcfun gtk-text-buffer-create-child-anchor (g-object text-child-anchor)
464   (buffer (g-object text-buffer))
465   (iter (g-boxed-foreign text-iter)))
466
467 (defun text-buffer-insert-child-anchor (buffer position &optional anchor)
468   (if anchor
469       (progn (gtk-text-buffer-insert-child-anchor buffer position anchor)
470              anchor)
471       (gtk-text-buffer-create-child-anchor buffer position)))
472
473 (export 'text-buffer-insert-child-anchor)
474
475 (defcfun gtk-text-buffer-create-mark (g-object text-mark)
476   (buffer (g-object text-buffer))
477   (name (:string :free-to-foreign t))
478   (position (g-boxed-foreign text-iter))
479   (left-gravity :boolean))
480
481 (defun text-buffer-create-mark (buffer name position &optional (left-gravity t))
482   (gtk-text-buffer-create-mark buffer name position left-gravity))
483
484 (export 'text-buffer-create-mark)
485
486 (defcfun gtk-text-buffer-move-mark :void
487   (buffer (g-object text-buffer))
488   (mark (g-object text-mark))
489   (position (g-boxed-foreign text-iter)))
490
491 (defcfun gtk-text-buffer-move-mark-by-name :void
492   (buffer (g-object text-buffer))
493   (name (:string :free-to-foreign t))
494   (position (g-boxed-foreign text-iter)))
495
496 (defun text-buffer-move-mark (buffer mark position)
497   (etypecase mark
498     (string (gtk-text-buffer-move-mark-by-name buffer mark position))
499     (text-mark (gtk-text-buffer-move-mark buffer mark position))))
500
501 (export 'text-buffer-move-mark)
502
503 (defcfun (text-buffer-add-mark "gtk_text_buffer_add_mark") :void
504   (buffer (g-object text-buffer))
505   (mark (g-object text-mark))
506   (position (g-boxed-foreign text-iter)))
507
508 (export 'text-buffer-add-mark)
509
510 (defcfun gtk-text-buffer-delete-mark :void
511   (buffer (g-object text-buffer))
512   (mark (g-object text-mark)))
513
514 (defcfun gtk-text-buffer-delete-mark-by-name :void
515   (buffer (g-object text-buffer))
516   (name (:string :free-to-foreign t)))
517
518 (defun text-buffer-delete-mark (buffer mark)
519   (etypecase mark
520     (string (gtk-text-buffer-delete-mark-by-name buffer mark))
521     (text-mark (gtk-text-buffer-delete-mark buffer mark))))
522
523 (export 'text-buffer-delete-mark)
524
525 (defcfun (text-buffer-get-mark "gtk_text_buffer_get_mark") (g-object text-mark)
526   (buffer (g-object text-buffer))
527   (name (:string :free-to-foreign t)))
528
529 (export 'text-buffer-get-mark)
530
531 (defcfun (text-buffer-insertion-mark "gtk_text_buffer_get_insert") (g-object text-mark)
532   (buffer (g-object text-buffer)))
533
534 (export 'text-buffer-insertion-mark)
535
536 (defcfun (text-buffer-selection-bound "gtk_text_buffer_get_selection_bound") (g-object text-mark)
537   (buffer (g-object text-buffer))
538   (name (:string :free-to-foreign t)))
539
540 (export 'text-buffer-selection-bound)
541
542 (defcfun (text-buffer-place-cursor "gtk_text_buffer_place_cursor") :void
543   (buffer (g-object text-buffer))
544   (position (g-boxed-foreign text-iter)))
545
546 (export 'text-buffer-place-cursor)
547
548 (defcfun (text-buffer-select-range "gtk_text_buffer_select_range") :void
549   (buffer (g-object text-buffer))
550   (insertion-point (g-boxed-foreign text-iter))
551   (selection-bound (g-boxed-foreign text-iter)))
552
553 (export 'text-buffer-select-range)
554
555 (defcfun gtk-text-buffer-apply-tag :void
556   (buffer (g-object text-buffer))
557   (tag (g-object text-tag))
558   (start (g-boxed-foreign text-iter))
559   (end (g-boxed-foreign text-iter)))
560
561 (defcfun gtk-text-buffer-apply-tag-by-name :void
562   (buffer (g-object text-buffer))
563   (name (:string :free-to-foreign t))
564   (start (g-boxed-foreign text-iter))
565   (end (g-boxed-foreign text-iter)))
566
567 (defun text-buffer-apply-tag (buffer tag start end)
568   (etypecase tag
569     (string (gtk-text-buffer-apply-tag-by-name buffer tag start end))
570     (text-tag (gtk-text-buffer-apply-tag buffer tag start end))))
571
572 (export 'text-buffer-apply-tag)
573
574 (defcfun gtk-text-buffer-remove-tag :void
575   (buffer (g-object text-buffer))
576   (tag (g-object text-tag))
577   (start (g-boxed-foreign text-iter))
578   (end (g-boxed-foreign text-iter)))
579
580 (defcfun gtk-text-buffer-remove-tag-by-name :void
581   (buffer (g-object text-buffer))
582   (name (:string :free-to-foreign t))
583   (start (g-boxed-foreign text-iter))
584   (end (g-boxed-foreign text-iter)))
585
586 (defun text-buffer-remove-tag (buffer tag start end)
587   (etypecase tag
588     (string (gtk-text-buffer-remove-tag-by-name buffer tag start end))
589     (text-tag (gtk-text-buffer-remove-tag buffer tag start end))))
590
591 (export 'text-buffer-remove-tag)
592
593 (defcfun (text-buffer-remove-all-tags "gtk_text_buffer_remove_all_tags") :void
594   (buffer (g-object text-buffer))
595   (start (g-boxed-foreign text-iter))
596   (end (g-boxed-foreign text-iter)))
597
598 (defcfun gtk-text-buffer-get-iter-at-line-offset :void
599   (buffer (g-object text-buffer))
600   (iter (g-boxed-foreign text-iter))
601   (line-number :int)
602   (char-offset :int))
603
604 (defun text-buffer-get-iter-at-line-offset (buffer line-number char-offset)
605   (let ((iter (make-instance 'text-iter)))
606     (gtk-text-buffer-get-iter-at-line-offset buffer iter line-number char-offset)
607     iter))
608
609 (export 'text-buffer-get-iter-at-line-offset)
610
611 (defcfun gtk-text-buffer-get-iter-at-offset :void
612   (buffer (g-object text-buffer))
613   (iter (g-boxed-foreign text-iter))
614   (char-offset :int))
615
616 (defun text-buffer-get-iter-at-offset (buffer offset)
617   (let ((iter (make-instance 'text-iter)))
618     (gtk-text-buffer-get-iter-at-offset buffer iter offset)
619     iter))
620
621 (export 'text-buffer-get-iter-at-offset)
622
623 (defcfun gtk-text-buffer-get-iter-at-line :void
624   (buffer (g-object text-buffer))
625   (iter (g-boxed-foreign text-iter))
626   (line-number :int))
627
628 (defun text-buffer-get-iter-at-line (buffer line-number)
629   (let ((iter (make-instance 'text-iter)))
630     (gtk-text-buffer-get-iter-at-line buffer iter line-number)
631     iter))
632
633 (export 'text-buffet-get-iter-at-line)
634
635 (defcfun gtk-text-buffer-get-iter-at-mark :void
636   (buffer (g-object text-buffer))
637   (iter (g-boxed-foreign text-iter))
638   (mark (g-object text-mark)))
639
640 (defun text-buffer-get-iter-at-mark (buffer mark)
641   (when (stringp mark)
642     (setf mark (text-buffer-get-mark buffer mark)))
643   (let ((iter (make-instance 'text-iter)))
644     (gtk-text-buffer-get-iter-at-mark buffer iter mark)
645     iter))
646
647 (export 'text-buffer-get-iter-at-mark)
648
649 (defcfun gtk-text-buffer-get-iter-at-child-anchor :void
650   (buffer (g-object text-buffer))
651   (iter (g-boxed-foreign text-iter))
652   (anchor (g-object text-child-anchor)))
653
654 (defun text-buffer-get-iter-at-child-anchor (buffer anchor)
655   (let ((iter (make-instance 'text-iter)))
656     (gtk-text-buffer-get-iter-at-child-anchor buffer iter anchor)
657     iter))
658
659 (export 'text-buffer-get-iter-at-child-anchor)
660
661 (defcfun gtk-text-buffer-get-start-iter :void
662   (buffer (g-object text-buffer))
663   (iter (g-boxed-foreign text-iter)))
664
665 (defun text-buffer-get-start-iter (buffer)
666   (let ((iter (make-instance 'text-iter)))
667     (gtk-text-buffer-get-start-iter buffer iter)
668     iter))
669
670 (export 'text-buffer-get-start-iter)
671
672 (defcfun gtk-text-buffer-get-end-iter :void
673   (buffer (g-object text-buffer))
674   (iter (g-boxed-foreign text-iter)))
675
676 (defun text-buffer-get-end-iter (buffer)
677   (let ((iter (make-instance 'text-iter)))
678     (gtk-text-buffer-get-end-iter buffer iter)
679     iter))
680
681 (export 'text-buffer-get-end-iter)
682
683 (defcfun gtk-text-buffer-get-bounds :void
684   (buffer (g-object text-buffer))
685   (start (g-boxed-foreign text-iter))
686   (end (g-boxed-foreign text-iter)))
687
688 (defun text-buffer-get-bounds (buffer)
689   (let ((start (make-instance 'text-iter))
690         (end (make-instance 'text-iter)))
691     (gtk-text-buffer-get-bounds buffer start end)
692     (values start end)))
693
694 (export 'text-buffer-get-bounds)
695
696 (defcfun gtk-text-buffer-delete-selection :boolean
697   (bufer (g-object text-buffer))
698   (interactive :boolean)
699   (default-editable :boolean))
700
701 (defun text-buffer-delete-selection (buffer &key interactive default-editable)
702   (gtk-text-buffer-delete-selection buffer interactive default-editable))
703
704 (export 'text-buffer-delete-selection)
705
706 (defcfun gtk-text-buffer-paste-clipboard :void
707   (buffer (g-object text-buffer))
708   (clipboard (g-object clipboard))
709   (override-location (g-boxed-foreign text-iter))
710   (default-editable :boolean))
711
712 (defun text-buffer-paste-clipboard (buffer clipboard &key position default-editable)
713   (gtk-text-buffer-paste-clipboard buffer clipboard position default-editable))
714
715 (export 'text-buffer-paste-clipboard)
716
717 (defcfun (text-buffer-copy-clipboard "gtk_text_buffer_copy_clipboard") :void
718   (buffer (g-object text-buffer))
719   (clipboard (g-object clipboard)))
720
721 (export 'text-buffer-copy-clipboard)
722
723 (defcfun (text-buffer-cut-clipboard "gtk_text_buffer_cut_clipboard") :void
724   (buffer (g-object text-buffer))
725   (clipboard (g-object clipboard)))
726
727 (export 'text-buffer-cut-clipboard)
728
729 (defcfun gtk-text-buffer-get-selection-bounds :boolean
730   (buffer (g-object text-buffer))
731   (start (g-boxed-foreign text-iter))
732   (end (g-boxed-foreign text-iter)))
733
734 (defun text-buffer-get-selection-bounds (buffer)
735   (let ((i1 (make-instance 'text-iter))
736         (i2 (make-instance 'text-iter)))
737     (if (gtk-text-buffer-get-selection-bounds buffer i1 i2)
738         (values i1 i2)
739         (values nil nil))))
740
741 (export 'text-buffer-get-selection-bounds)
742
743 (defcfun (text-buffer-begin-user-action "gtk_text_buffer_begin_user_action") :void
744   (buffer (g-object text-buffer)))
745
746 (export 'text-buffer-begin-user-action)
747
748 (defcfun (text-buffer-end-user-action "gtk_text_buffer_end_user_action") :void
749   (buffer (g-object text-buffer)))
750
751 (export 'text-buffer-end-user-action)
752
753 (defmacro with-text-buffer-user-action ((buffer) &body body)
754   (let ((g (gensym)))
755     `(let ((,g ,buffer))
756        (text-buffer-begin-user-action ,g)
757        (unwind-protect
758             (progn ,@body)
759          (text-buffer-end-user-action ,g)))))
760
761 (export 'with-text-buffer-user-action)
762
763 (defcfun (text-buffer-add-selection-clipboard "gtk_text_buffer_add_selection_clipboard") :void
764   (buffer (g-object text-buffer))
765   (clipboard (g-object clipboard)))
766
767 (defcfun (text-buffer-remove-selection-clipboard "gtk_text_buffer_remove_selection_clipboard") :void
768   (buffer (g-object text-buffer))
769   (clipboard (g-object clipboard)))
770
771 (export 'text-buffer-remove-selection-clipboard)
772
773 ;; enum                GtkTextBufferTargetInfo;
774 ;; gboolean            (*GtkTextBufferDeserializeFunc)     (GtkTextBuffer *register_buffer,
775 ;;                                                          GtkTextBuffer *content_buffer,
776 ;;                                                          GtkTextIter *iter,
777 ;;                                                          const guint8 *data,
778 ;;                                                          gsize length,
779 ;;                                                          gboolean create_tags,
780 ;;                                                          gpointer user_data,
781 ;;                                                          GError **error);
782 ;; gboolean            gtk_text_buffer_deserialize         (GtkTextBuffer *register_buffer,
783 ;;                                                          GtkTextBuffer *content_buffer,
784 ;;                                                          GdkAtom format,
785 ;;                                                          GtkTextIter *iter,
786 ;;                                                          const guint8 *data,
787 ;;                                                          gsize length,
788 ;;                                                          GError **error);
789 ;; gboolean            gtk_text_buffer_deserialize_get_can_create_tags
790 ;;                                                         (GtkTextBuffer *buffer,
791 ;;                                                          GdkAtom format);
792 ;; void                gtk_text_buffer_deserialize_set_can_create_tags
793 ;;                                                         (GtkTextBuffer *buffer,
794 ;;                                                          GdkAtom format,
795 ;;                                                          gboolean can_create_tags);
796 ;; GtkTargetList*      gtk_text_buffer_get_copy_target_list
797 ;;                                                         (GtkTextBuffer *buffer);
798 ;; GdkAtom*            gtk_text_buffer_get_deserialize_formats
799 ;;                                                         (GtkTextBuffer *buffer,
800 ;;                                                          gint *n_formats);
801 ;; GtkTargetList*      gtk_text_buffer_get_paste_target_list
802 ;;                                                         (GtkTextBuffer *buffer);
803 ;; GdkAtom*            gtk_text_buffer_get_serialize_formats
804 ;;                                                         (GtkTextBuffer *buffer,
805 ;;                                                          gint *n_formats);
806 ;; GdkAtom             gtk_text_buffer_register_deserialize_format
807 ;;                                                         (GtkTextBuffer *buffer,
808 ;;                                                          const gchar *mime_type,
809 ;;                                                          GtkTextBufferDeserializeFunc function,
810 ;;                                                          gpointer user_data,
811 ;;                                                          GDestroyNotify user_data_destroy);
812 ;; GdkAtom             gtk_text_buffer_register_deserialize_tagset
813 ;;                                                         (GtkTextBuffer *buffer,
814 ;;                                                          const gchar *tagset_name);
815 ;; GdkAtom             gtk_text_buffer_register_serialize_format
816 ;;                                                         (GtkTextBuffer *buffer,
817 ;;                                                          const gchar *mime_type,
818 ;;                                                          GtkTextBufferSerializeFunc function,
819 ;;                                                          gpointer user_data,
820 ;;                                                          GDestroyNotify user_data_destroy);
821 ;; GdkAtom             gtk_text_buffer_register_serialize_tagset
822 ;;                                                         (GtkTextBuffer *buffer,
823 ;;                                                          const gchar *tagset_name);
824 ;; guint8*             (*GtkTextBufferSerializeFunc)       (GtkTextBuffer *register_buffer,
825 ;;                                                          GtkTextBuffer *content_buffer,
826 ;;                                                          const GtkTextIter *start,
827 ;;                                                          const GtkTextIter *end,
828 ;;                                                          gsize *length,
829 ;;                                                          gpointer user_data);
830 ;; guint8*             gtk_text_buffer_serialize           (GtkTextBuffer *register_buffer,
831 ;;                                                          GtkTextBuffer *content_buffer,
832 ;;                                                          GdkAtom format,
833 ;;                                                          const GtkTextIter *start,
834 ;;                                                          const GtkTextIter *end,
835 ;;                                                          gsize *length);
836 ;; void                gtk_text_buffer_unregister_deserialize_format
837 ;;                                                         (GtkTextBuffer *buffer,
838 ;;                                                          GdkAtom format);
839 ;; void                gtk_text_buffer_unregister_serialize_format
840 ;;                                                         (GtkTextBuffer *buffer,
841 ;;                                                          GdkAtom format);
842
843 ;; text tag
844
845 ;; text tag table
846
847 (defcallback gtk-text-tag-table-foreach-function :void ((tag (g-object text-tag)) (data :pointer))
848   (funcall (get-stable-pointer-value data) tag))
849
850 (defcfun (text-tag-table-add "gtk_text_tag_table_add") :void
851   (table (g-object text-tag-table))
852   (tag (g-object text-tag)))
853
854 (export 'text-tag-table-add)
855
856 (defcfun (text-tag-table-remove "gtk_text_tag_table_remove") :void
857   (table (g-object text-tag-table))
858   (tag (g-object text-tag)))
859
860 (export 'text-tag-table-remove)
861
862 (defcfun (text-tag-table-lookup "gtk_text_tag_table_lookup") (g-object text-tag)
863   (table (g-object text-tag-table))
864   (name (:string :free-to-foreign t)))
865
866 (export 'text-tag-table-lookup)
867
868 (defcfun gtk-text-tag-table-foreach :void
869   (table (g-object text-tag-table))
870   (function :pointer)
871   (data :pointer))
872
873 (defun text-tag-table-foreach (table function)
874   (with-stable-pointer (ptr function)
875     (gtk-text-tag-table-foreach table (callback gtk-text-tag-table-foreach-function) ptr)))
876
877 (export 'text-tag-table-foreach)
878
879 (defcfun (text-tag-table-size "gtk_text_tag_table_get_size") :int
880   (table (g-object text-tag-table)))
881
882 (export 'text-tag-table-size)
883
884 ;; text view
885
886 (defcfun gtk-text-view-scroll-to-mark :void
887   (text-view (g-object text-view))
888   (mark (g-object text-mark))
889   (within-margin :double)
890   (use-align :boolean)
891   (x-align :double)
892   (y-align :double))
893
894 (defun text-view-scroll-to-mark (text-view mark &key (within-margin 0.4) (x-align 0.0 x-align-supplied) (y-align 0.0 y-align-supplied))
895   (gtk-text-view-scroll-to-mark text-view mark within-margin (or x-align-supplied y-align-supplied) (coerce x-align 'double-float) (coerce y-align 'double-float)))
896
897 (export 'text-view-scroll-to-mark)
898
899 (defcfun gtk-text-view-scroll-to-iter :void
900   (text-view (g-object text-view))
901   (iter (g-object text-iter))
902   (within-margin :double)
903   (use-align :boolean)
904   (x-align :double)
905   (y-align :double))
906
907 (defun text-view-scroll-to-iter (text-view iter &key (within-margin 0.4) (x-align 0.0 x-align-supplied) (y-align 0.0 y-align-supplied))
908   (gtk-text-view-scroll-to-iter text-view iter within-margin (or x-align-supplied y-align-supplied) (coerce x-align 'double-float) (coerce y-align 'double-float)))
909
910 (export 'text-view-scroll-to-iter)
911
912 (defcfun (text-view-move-mark-onscreen "gtk_text_view_move_mark_onscreen") :boolean
913   (text-view (g-object text-view))
914   (mark (g-object text-mark)))
915
916 (export 'text-view-move-mark-onscreen)
917
918 (defcfun (text-view-place-cursor-onscreen "gtk_text_view_place_cursor_onscreen") :boolean
919   (text-view (g-object text-view)))
920
921 (export 'text-view-place-cursor-onscreen)
922
923 (defcfun gtk-text-view-get-visible-rect :void
924   (text-view (g-object text-view))
925   (visible-rect (g-boxed-foreign rectangle)))
926
927 (defun text-view-visible-rect (text-view)
928   (let ((rect (make-rectangle :x 0 :y 0 :width 0 :height 0)))
929     (gtk-text-view-get-visible-rect text-view rect)
930     rect))
931
932 (export 'text-view-visible-rect)
933
934 (defcfun gtk-text-view-get-iter-location :void
935   (text-view (g-object text-view))
936   (iter (g-boxed-foreign text-iter))
937   (location (g-boxed-foreign rectangle)))
938
939 (defun text-view-iter-location (text-view iter)
940   (let ((rect (make-rectangle :x 0 :y 0 :width 0 :height 0)))
941     (gtk-text-view-get-iter-location text-view iter rect)
942     rect))
943
944 (export 'text-view-iter-location)
945
946
947 ;; void                gtk_text_view_get_line_at_y         (GtkTextView *text_view,
948 ;;                                                          GtkTextIter *target_iter,
949 ;;                                                          gint y,
950 ;;                                                          gint *line_top);
951 ;; void                gtk_text_view_get_line_yrange       (GtkTextView *text_view,
952 ;;                                                          const GtkTextIter *iter,
953 ;;                                                          gint *y,
954 ;;                                                          gint *height);
955
956 (defcfun gtk-text-view-get-iter-at-location :void
957   (text-view (g-object text-view))
958   (iter (g-boxed-foreign text-iter))
959   (x :int)
960   (y :int))
961
962 (defun text-view-get-iter-at-location (view x y)
963   (let ((iter (make-instance 'text-iter)))
964     (gtk-text-view-get-iter-at-location view iter x y)
965     iter))
966
967 (export 'text-view-get-iter-at-location)
968
969 ;; void                gtk_text_view_get_iter_at_position  (GtkTextView *text_view,
970 ;;                                                          GtkTextIter *iter,
971 ;;                                                          gint *trailing,
972 ;;                                                          gint x,
973 ;;                                                          gint y);
974 ;; void                gtk_text_view_buffer_to_window_coords
975 ;;                                                         (GtkTextView *text_view,
976 ;;                                                          GtkTextWindowType win,
977 ;;                                                          gint buffer_x,
978 ;;                                                          gint buffer_y,
979 ;;                                                          gint *window_x,
980 ;;                                                          gint *window_y);
981
982 (defcfun gtk-text-view-window-to-buffer-coords :void
983   (text-view (g-object text-view))
984   (win text-window-type)
985   (window-x :int)
986   (window-y :int)
987   (buffer-x :pointer)
988   (buffer-y :pointer))
989
990 (defun text-view-window-to-buffer-coords (text-view win window-x window-y)
991   (with-foreign-objects ((buffer-x :int) (buffer-y :int))
992     (gtk-text-view-window-to-buffer-coords text-view win window-x window-y buffer-x buffer-y)
993     (values (mem-ref buffer-x :int)
994             (mem-ref buffer-y :int))))
995
996 (export 'text-view-window-to-buffer-coords)
997
998 (defcfun gtk-text-view-get-window (g-object gdk:gdk-window)
999   (text-view (g-object text-view))
1000   (win text-window-type))
1001
1002 (defun text-view-get-window (text-view win)
1003   (gtk-text-view-get-window text-view win))
1004
1005 (export 'text-view-get-window)
1006
1007 ;; GtkTextWindowType   gtk_text_view_get_window_type       (GtkTextView *text_view,
1008 ;;                                                          GdkWindow *window);
1009 ;; void                gtk_text_view_set_border_window_size
1010 ;;                                                         (GtkTextView *text_view,
1011 ;;                                                          GtkTextWindowType type,
1012 ;;                                                          gint size);
1013 ;; gint                gtk_text_view_get_border_window_size
1014 ;;                                                         (GtkTextView *text_view,
1015 ;;                                                          GtkTextWindowType type);
1016 ;; gboolean            gtk_text_view_forward_display_line  (GtkTextView *text_view,
1017 ;;                                                          GtkTextIter *iter);
1018 ;; gboolean            gtk_text_view_backward_display_line (GtkTextView *text_view,
1019 ;;                                                          GtkTextIter *iter);
1020 ;; gboolean            gtk_text_view_forward_display_line_end
1021 ;;                                                         (GtkTextView *text_view,
1022 ;;                                                          GtkTextIter *iter);
1023 ;; gboolean            gtk_text_view_backward_display_line_start
1024 ;;                                                         (GtkTextView *text_view,
1025 ;;                                                          GtkTextIter *iter);
1026 ;; gboolean            gtk_text_view_starts_display_line   (GtkTextView *text_view,
1027 ;;                                                          const GtkTextIter *iter);
1028 ;; gboolean            gtk_text_view_move_visually         (GtkTextView *text_view,
1029 ;;                                                          GtkTextIter *iter,
1030 ;;                                                          gint count);
1031 ;; void                gtk_text_view_add_child_at_anchor   (GtkTextView *text_view,
1032 ;;                                                          GtkWidget *child,
1033 ;;                                                          GtkTextChildAnchor *anchor);
1034
1035 (defcfun (text-view-add-child-at-anchor "gtk_text_view_add_child_at_anchor") :void
1036   (text-view g-object)
1037   (child g-object)
1038   (anchor g-object))
1039
1040 (export 'text-view-add-child-at-anchor)
1041
1042 ;;                     GtkTextChildAnchor;
1043 ;; GtkTextChildAnchor* gtk_text_child_anchor_new           (void);
1044 ;; GList*              gtk_text_child_anchor_get_widgets   (GtkTextChildAnchor *anchor);
1045 ;; gboolean            gtk_text_child_anchor_get_deleted   (GtkTextChildAnchor *anchor);
1046 ;; void                gtk_text_view_add_child_in_window   (GtkTextView *text_view,
1047 ;;                                                          GtkWidget *child,
1048 ;;                                                          GtkTextWindowType which_window,
1049 ;;                                                          gint xpos,
1050 ;;                                                          gint ypos);
1051 ;; void                gtk_text_view_move_child            (GtkTextView *text_view,
1052 ;;                                                          GtkWidget *child,
1053 ;;                                                          gint xpos,
1054 ;;                                                          gint ypos);