Use new GBoxed in GDK and GTK
[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         (progn (release i1)
288                (release i2)
289                (values nil nil nil)))))
290
291 (export 'text-iter-search)
292
293 (defcfun (text-iter-equal "gtk_text_iter_equal") :boolean
294   (iter-1 (g-boxed-foreign text-iter))
295   (iter-2 (g-boxed-foreign text-iter)))
296
297 (export 'text-iter-equal)
298
299 (defcfun (text-iter-compare "gtk_text_iter_compare") :int
300   (iter-1 (g-boxed-foreign text-iter))
301   (iter-2 (g-boxed-foreign text-iter)))
302
303 (export 'text-iter-compare)
304
305 (defcfun (text-iter-in-range "gtk_text_iter_in_range") :boolean
306   (iter (g-boxed-foreign text-iter))
307   (start (g-boxed-foreign text-iter))
308   (end (g-boxed-foreign text-iter)))
309
310 (export 'text-iter-in-range)
311
312 (defcfun (text-iter-order "gtk_text_iter_order") :void
313   (iter-1 (g-boxed-foreign text-iter))
314   (iter-2 (g-boxed-foreign text-iter)))
315
316 (export 'text-iter-order)
317
318 ;; text mark
319
320 (defcfun (text-mark-visible "gtk_text_mark_get_visible") :boolean
321   (mark (g-object text-mark)))
322
323 (defcfun gtk-text-mark-set-visible :void
324   (mark (g-object text-mark))
325   (visible :boolean))
326
327 (defun (setf text-mark-visible) (new-value mark)
328   (gtk-text-mark-set-visible mark new-value))
329
330 (export 'text-mark-visible)
331
332 (defcfun (text-mark-deleted "gtk_text_mark_get_deleted") :boolean
333   (mark (g-object text-mark)))
334
335 (export 'text-mark-deleted)
336
337 (defcfun (text-mark-buffer "gtk_text_mark_get_buffer") (g-object text-buffer)
338   (mark (g-object text-mark)))
339
340 (export 'text-mark-buffer)
341
342 ;; text buffer
343
344 (defcfun (text-buffer-line-count "gtk_text_buffer_get_line_count") :int
345   (buffer (g-object text-buffer)))
346
347 (export 'text-buffer-line-count)
348
349 (defcfun (text-buffer-char-count "gtk_text_buffer_get_char_count") :int
350   (buffer (g-object text-buffer)))
351
352 (export 'text-buffer)
353
354 (defcfun gtk-text-buffer-insert :void
355   (buffer (g-object text-buffer))
356   (iter (g-boxed-foreign text-iter))
357   (text (:string :free-to-foreign t))
358   (len :int))
359
360 (defcfun gtk-text-buffer-insert-at-cursor :void
361   (buffer (g-object text-buffer))
362   (text (:string :free-to-foreign t))
363   (len :int))
364
365 (defcfun gtk-text-buffer-insert-interactive :boolean
366   (buffer (g-object text-buffer))
367   (iter (g-boxed-foreign text-iter))
368   (text (:string :free-to-foreign t))
369   (len :int)
370   (default-editable :boolean))
371
372 (defcfun gtk-text-buffer-insert-interactive-at-cursor :boolean
373   (buffer (g-object text-buffer))
374   (text (:string :free-to-foreign t))
375   (len :int)
376   (default-editable :boolean))
377
378 (defun text-buffer-insert (buffer text &key (position :cursor) (interactive nil) (default-editable t))
379   (assert (typep position '(or text-iter (member :cursor))))
380   (if interactive
381       (if (eq position :cursor)
382           (gtk-text-buffer-insert-interactive-at-cursor buffer text -1 default-editable)
383           (gtk-text-buffer-insert-interactive buffer position text -1 default-editable))
384       (progn (if (eq position :cursor)
385                  (gtk-text-buffer-insert-at-cursor buffer text -1)
386                  (gtk-text-buffer-insert buffer position text -1))
387              t)))
388
389 (export 'text-buffer-insert)
390
391 (defcfun gtk-text-buffer-insert-range :void
392   (buffer (g-object text-buffer))
393   (iter (g-boxed-foreign text-iter))
394   (range-start (g-boxed-foreign text-iter))
395   (range-end (g-boxed-foreign text-iter)))
396
397 (defcfun gtk-text-buffer-insert-range-interactive :boolean
398   (buffer (g-object text-buffer))
399   (iter (g-boxed-foreign text-iter))
400   (range-start (g-boxed-foreign text-iter))
401   (range-end (g-boxed-foreign text-iter))
402   (default-editable :boolean))
403
404 (defun text-buffer-insert-range (buffer position range-start range-end &key interactive default-editable)
405   (if interactive
406       (gtk-text-buffer-insert-range-interactive buffer position range-start range-end default-editable)
407       (progn (gtk-text-buffer-insert-range buffer position range-start range-end)
408              t)))
409
410 (export 'text-buffer-insert-range)
411
412 (defcfun gtk-text-buffer-delete :void
413   (buffer (g-object text-buffer))
414   (range-start (g-boxed-foreign text-iter))
415   (range-end (g-boxed-foreign text-iter)))
416
417 (defcfun gtk-text-buffer-delete-interactive :boolean
418   (buffer (g-object text-buffer))
419   (range-start (g-boxed-foreign text-iter))
420   (range-end (g-boxed-foreign text-iter))
421   (default-editable :boolean))
422
423 (defun text-buffer-delete (buffer range-start range-end &key interactive default-editable)
424   (if interactive
425       (gtk-text-buffer-delete-interactive buffer range-start range-end default-editable)
426       (progn (gtk-text-buffer-delete buffer range-start range-end)
427              t)))
428
429 (export 'text-buffer-delete)
430
431 (defcfun gtk-text-buffer-backspace :boolean
432   (buffer (g-object text-buffer))
433   (iter (g-boxed-foreign text-iter))
434   (interactive :boolean)
435   (default-editable :boolean))
436
437 (defun text-buffer-backspace (buffer position &key interactive default-editable)
438   (gtk-text-buffer-backspace buffer position interactive default-editable))
439
440 (export 'text-buffer-backspace)
441
442 (defcfun gtk-text-buffer-get-slice (:string :free-from-foreign t)
443   (buffer (g-object text-buffer))
444   (range-start (g-boxed-foreign text-iter))
445   (range-end (g-boxed-foreign text-iter))
446   (include-hidden-chars :boolean))
447
448 (defun text-buffer-slice (buffer range-start range-end &key include-hidden-chars)
449   (gtk-text-buffer-get-slice buffer range-start range-end include-hidden-chars))
450
451 (export 'text-buffer-slice)
452
453 (defcfun (text-buffer-insert-pixbuf "gtk_text_buffer_insert_pixbuf") :void
454   (buffer (g-object text-buffer))
455   (position (g-boxed-foreign text-iter))
456   (pixbuf (g-object pixbuf)))
457
458 (export 'text-buffer-insert-pixbuf)
459
460 (defcfun gtk-text-buffer-insert-child-anchor :void
461   (buffer (g-object text-buffer))
462   (iter (g-boxed-foreign text-iter))
463   (anchor (g-object text-child-anchor)))
464
465 (defcfun gtk-text-buffer-create-child-anchor (g-object text-child-anchor)
466   (buffer (g-object text-buffer))
467   (iter (g-boxed-foreign text-iter)))
468
469 (defun text-buffer-insert-child-anchor (buffer position &optional anchor)
470   (if anchor
471       (progn (gtk-text-buffer-insert-child-anchor buffer position anchor)
472              anchor)
473       (gtk-text-buffer-create-child-anchor buffer position)))
474
475 (export 'text-buffer-insert-child-anchor)
476
477 (defcfun gtk-text-buffer-create-mark (g-object text-mark)
478   (buffer (g-object text-buffer))
479   (name (:string :free-to-foreign t))
480   (position (g-boxed-foreign text-iter))
481   (left-gravity :boolean))
482
483 (defun text-buffer-create-mark (buffer name position &optional (left-gravity t))
484   (gtk-text-buffer-create-mark buffer name position left-gravity))
485
486 (export 'text-buffer-create-mark)
487
488 (defcfun gtk-text-buffer-move-mark :void
489   (buffer (g-object text-buffer))
490   (mark (g-object text-mark))
491   (position (g-boxed-foreign text-iter)))
492
493 (defcfun gtk-text-buffer-move-mark-by-name :void
494   (buffer (g-object text-buffer))
495   (name (:string :free-to-foreign t))
496   (position (g-boxed-foreign text-iter)))
497
498 (defun text-buffer-move-mark (buffer mark position)
499   (etypecase mark
500     (string (gtk-text-buffer-move-mark-by-name buffer mark position))
501     (text-mark (gtk-text-buffer-move-mark buffer mark position))))
502
503 (export 'text-buffer-move-mark)
504
505 (defcfun (text-buffer-add-mark "gtk_text_buffer_add_mark") :void
506   (buffer (g-object text-buffer))
507   (mark (g-object text-mark))
508   (position (g-boxed-foreign text-iter)))
509
510 (export 'text-buffer-add-mark)
511
512 (defcfun gtk-text-buffer-delete-mark :void
513   (buffer (g-object text-buffer))
514   (mark (g-object text-mark)))
515
516 (defcfun gtk-text-buffer-delete-mark-by-name :void
517   (buffer (g-object text-buffer))
518   (name (:string :free-to-foreign t)))
519
520 (defun text-buffer-delete-mark (buffer mark)
521   (etypecase mark
522     (string (gtk-text-buffer-delete-mark-by-name buffer mark))
523     (text-mark (gtk-text-buffer-delete-mark buffer mark))))
524
525 (export 'text-buffer-delete-mark)
526
527 (defcfun (text-buffer-get-mark "gtk_text_buffer_get_mark") (g-object text-mark)
528   (buffer (g-object text-buffer))
529   (name (:string :free-to-foreign t)))
530
531 (export 'text-buffer-get-mark)
532
533 (defcfun (text-buffer-insertion-mark "gtk_text_buffer_get_insert") (g-object text-mark)
534   (buffer (g-object text-buffer)))
535
536 (export 'text-buffer-insertion-mark)
537
538 (defcfun (text-buffer-selection-bound "gtk_text_buffer_get_selection_bound") (g-object text-mark)
539   (buffer (g-object text-buffer))
540   (name (:string :free-to-foreign t)))
541
542 (export 'text-buffer-selection-bound)
543
544 (defcfun (text-buffer-place-cursor "gtk_text_buffer_place_cursor") :void
545   (buffer (g-object text-buffer))
546   (position (g-boxed-foreign text-iter)))
547
548 (export 'text-buffer-place-cursor)
549
550 (defcfun (text-buffer-select-range "gtk_text_buffer_select_range") :void
551   (buffer (g-object text-buffer))
552   (insertion-point (g-boxed-foreign text-iter))
553   (selection-bound (g-boxed-foreign text-iter)))
554
555 (export 'text-buffer-select-range)
556
557 (defcfun gtk-text-buffer-apply-tag :void
558   (buffer (g-object text-buffer))
559   (tag (g-object text-tag))
560   (start (g-boxed-foreign text-iter))
561   (end (g-boxed-foreign text-iter)))
562
563 (defcfun gtk-text-buffer-apply-tag-by-name :void
564   (buffer (g-object text-buffer))
565   (name (:string :free-to-foreign t))
566   (start (g-boxed-foreign text-iter))
567   (end (g-boxed-foreign text-iter)))
568
569 (defun text-buffer-apply-tag (buffer tag start end)
570   (etypecase tag
571     (string (gtk-text-buffer-apply-tag-by-name buffer tag start end))
572     (text-tag (gtk-text-buffer-apply-tag buffer tag start end))))
573
574 (export 'text-buffer-apply-tag)
575
576 (defcfun gtk-text-buffer-remove-tag :void
577   (buffer (g-object text-buffer))
578   (tag (g-object text-tag))
579   (start (g-boxed-foreign text-iter))
580   (end (g-boxed-foreign text-iter)))
581
582 (defcfun gtk-text-buffer-remove-tag-by-name :void
583   (buffer (g-object text-buffer))
584   (name (:string :free-to-foreign t))
585   (start (g-boxed-foreign text-iter))
586   (end (g-boxed-foreign text-iter)))
587
588 (defun text-buffer-remove-tag (buffer tag start end)
589   (etypecase tag
590     (string (gtk-text-buffer-remove-tag-by-name buffer tag start end))
591     (text-tag (gtk-text-buffer-remove-tag buffer tag start end))))
592
593 (export 'text-buffer-remove-tag)
594
595 (defcfun (text-buffer-remove-all-tags "gtk_text_buffer_remove_all_tags") :void
596   (buffer (g-object text-buffer))
597   (start (g-boxed-foreign text-iter))
598   (end (g-boxed-foreign text-iter)))
599
600 (defcfun gtk-text-buffer-get-iter-at-line-offset :void
601   (buffer (g-object text-buffer))
602   (iter (g-boxed-foreign text-iter))
603   (line-number :int)
604   (char-offset :int))
605
606 (defun text-buffer-get-iter-at-line-offset (buffer line-number char-offset)
607   (let ((iter (make-instance 'text-iter)))
608     (gtk-text-buffer-get-iter-at-line-offset buffer iter line-number char-offset)
609     iter))
610
611 (export 'text-buffer-get-iter-at-line-offset)
612
613 (defcfun gtk-text-buffer-get-iter-at-offset :void
614   (buffer (g-object text-buffer))
615   (iter (g-boxed-foreign text-iter))
616   (char-offset :int))
617
618 (defun text-buffer-get-iter-at-offset (buffer offset)
619   (let ((iter (make-instance 'text-iter)))
620     (gtk-text-buffer-get-iter-at-offset buffer iter offset)
621     iter))
622
623 (export 'text-buffer-get-iter-at-offset)
624
625 (defcfun gtk-text-buffer-get-iter-at-line :void
626   (buffer (g-object text-buffer))
627   (iter (g-boxed-foreign text-iter))
628   (line-number :int))
629
630 (defun text-buffer-get-iter-at-line (buffer line-number)
631   (let ((iter (make-instance 'text-iter)))
632     (gtk-text-buffer-get-iter-at-line buffer iter line-number)
633     iter))
634
635 (export 'text-buffet-get-iter-at-line)
636
637 (defcfun gtk-text-buffer-get-iter-at-mark :void
638   (buffer (g-object text-buffer))
639   (iter (g-boxed-foreign text-iter))
640   (mark (g-object text-mark)))
641
642 (defun text-buffer-get-iter-at-mark (buffer mark)
643   (when (stringp mark)
644     (setf mark (text-buffer-get-mark buffer mark)))
645   (let ((iter (make-instance 'text-iter)))
646     (gtk-text-buffer-get-iter-at-mark buffer iter mark)
647     iter))
648
649 (export 'text-buffer-get-iter-at-mark)
650
651 (defcfun gtk-text-buffer-get-iter-at-child-anchor :void
652   (buffer (g-object text-buffer))
653   (iter (g-boxed-foreign text-iter))
654   (anchor (g-object text-child-anchor)))
655
656 (defun text-buffer-get-iter-at-child-anchor (buffer anchor)
657   (let ((iter (make-instance 'text-iter)))
658     (gtk-text-buffer-get-iter-at-child-anchor buffer iter anchor)
659     iter))
660
661 (export 'text-buffer-get-iter-at-child-anchor)
662
663 (defcfun gtk-text-buffer-get-start-iter :void
664   (buffer (g-object text-buffer))
665   (iter (g-boxed-foreign text-iter)))
666
667 (defun text-buffer-get-start-iter (buffer)
668   (let ((iter (make-instance 'text-iter)))
669     (gtk-text-buffer-get-start-iter buffer iter)
670     iter))
671
672 (export 'text-buffer-get-start-iter)
673
674 (defcfun gtk-text-buffer-get-end-iter :void
675   (buffer (g-object text-buffer))
676   (iter (g-boxed-foreign text-iter)))
677
678 (defun text-buffer-get-end-iter (buffer)
679   (let ((iter (make-instance 'text-iter)))
680     (gtk-text-buffer-get-end-iter buffer iter)
681     iter))
682
683 (export 'text-buffer-get-end-iter)
684
685 (defcfun gtk-text-buffer-get-bounds :void
686   (buffer (g-object text-buffer))
687   (start (g-boxed-foreign text-iter))
688   (end (g-boxed-foreign text-iter)))
689
690 (defun text-buffer-get-bounds (buffer)
691   (let ((start (make-instance 'text-iter))
692         (end (make-instance 'text-iter)))
693     (gtk-text-buffer-get-bounds buffer start end)
694     (values start end)))
695
696 (export 'text-buffer-get-bounds)
697
698 (defcfun gtk-text-buffer-delete-selection :boolean
699   (bufer (g-object text-buffer))
700   (interactive :boolean)
701   (default-editable :boolean))
702
703 (defun text-buffer-delete-selection (buffer &key interactive default-editable)
704   (gtk-text-buffer-delete-selection buffer interactive default-editable))
705
706 (export 'text-buffer-delete-selection)
707
708 (defcfun gtk-text-buffer-paste-clipboard :void
709   (buffer (g-object text-buffer))
710   (clipboard (g-object clipboard))
711   (override-location (g-boxed-foreign text-iter))
712   (default-editable :boolean))
713
714 (defun text-buffer-paste-clipboard (buffer clipboard &key position default-editable)
715   (gtk-text-buffer-paste-clipboard buffer clipboard position default-editable))
716
717 (export 'text-buffer-paste-clipboard)
718
719 (defcfun (text-buffer-copy-clipboard "gtk_text_buffer_copy_clipboard") :void
720   (buffer (g-object text-buffer))
721   (clipboard (g-object clipboard)))
722
723 (export 'text-buffer-copy-clipboard)
724
725 (defcfun (text-buffer-cut-clipboard "gtk_text_buffer_cut_clipboard") :void
726   (buffer (g-object text-buffer))
727   (clipboard (g-object clipboard)))
728
729 (export 'text-buffer-cut-clipboard)
730
731 (defcfun gtk-text-buffer-get-selection-bounds :boolean
732   (buffer (g-object text-buffer))
733   (start (g-boxed-foreign text-iter))
734   (end (g-boxed-foreign text-iter)))
735
736 (defun text-buffer-get-selection-bounds (buffer)
737   (let ((i1 (make-instance 'text-iter))
738         (i2 (make-instance 'text-iter)))
739     (if (gtk-text-buffer-get-selection-bounds buffer i1 i2)
740         (values i1 i2)
741         (progn (release i1)
742                (release i2)
743                (values nil nil)))))
744
745 (export 'text-buffer-get-selection-bounds)
746
747 (defcfun (text-buffer-begin-user-action "gtk_text_buffer_begin_user_action") :void
748   (buffer (g-object text-buffer)))
749
750 (export 'text-buffer-begin-user-action)
751
752 (defcfun (text-buffer-end-user-action "gtk_text_buffer_end_user_action") :void
753   (buffer (g-object text-buffer)))
754
755 (export 'text-buffer-end-user-action)
756
757 (defmacro with-text-buffer-user-action ((buffer) &body body)
758   (let ((g (gensym)))
759     `(let ((,g ,buffer))
760        (text-buffer-begin-user-action ,g)
761        (unwind-protect
762             (progn ,@body)
763          (text-buffer-end-user-action ,g)))))
764
765 (export 'with-text-buffer-user-action)
766
767 (defcfun (text-buffer-add-selection-clipboard "gtk_text_buffer_add_selection_clipboard") :void
768   (buffer (g-object text-buffer))
769   (clipboard (g-object clipboard)))
770
771 (defcfun (text-buffer-remove-selection-clipboard "gtk_text_buffer_remove_selection_clipboard") :void
772   (buffer (g-object text-buffer))
773   (clipboard (g-object clipboard)))
774
775 (export 'text-buffer-remove-selection-clipboard)
776
777 ;; enum                GtkTextBufferTargetInfo;
778 ;; gboolean            (*GtkTextBufferDeserializeFunc)     (GtkTextBuffer *register_buffer,
779 ;;                                                          GtkTextBuffer *content_buffer,
780 ;;                                                          GtkTextIter *iter,
781 ;;                                                          const guint8 *data,
782 ;;                                                          gsize length,
783 ;;                                                          gboolean create_tags,
784 ;;                                                          gpointer user_data,
785 ;;                                                          GError **error);
786 ;; gboolean            gtk_text_buffer_deserialize         (GtkTextBuffer *register_buffer,
787 ;;                                                          GtkTextBuffer *content_buffer,
788 ;;                                                          GdkAtom format,
789 ;;                                                          GtkTextIter *iter,
790 ;;                                                          const guint8 *data,
791 ;;                                                          gsize length,
792 ;;                                                          GError **error);
793 ;; gboolean            gtk_text_buffer_deserialize_get_can_create_tags
794 ;;                                                         (GtkTextBuffer *buffer,
795 ;;                                                          GdkAtom format);
796 ;; void                gtk_text_buffer_deserialize_set_can_create_tags
797 ;;                                                         (GtkTextBuffer *buffer,
798 ;;                                                          GdkAtom format,
799 ;;                                                          gboolean can_create_tags);
800 ;; GtkTargetList*      gtk_text_buffer_get_copy_target_list
801 ;;                                                         (GtkTextBuffer *buffer);
802 ;; GdkAtom*            gtk_text_buffer_get_deserialize_formats
803 ;;                                                         (GtkTextBuffer *buffer,
804 ;;                                                          gint *n_formats);
805 ;; GtkTargetList*      gtk_text_buffer_get_paste_target_list
806 ;;                                                         (GtkTextBuffer *buffer);
807 ;; GdkAtom*            gtk_text_buffer_get_serialize_formats
808 ;;                                                         (GtkTextBuffer *buffer,
809 ;;                                                          gint *n_formats);
810 ;; GdkAtom             gtk_text_buffer_register_deserialize_format
811 ;;                                                         (GtkTextBuffer *buffer,
812 ;;                                                          const gchar *mime_type,
813 ;;                                                          GtkTextBufferDeserializeFunc function,
814 ;;                                                          gpointer user_data,
815 ;;                                                          GDestroyNotify user_data_destroy);
816 ;; GdkAtom             gtk_text_buffer_register_deserialize_tagset
817 ;;                                                         (GtkTextBuffer *buffer,
818 ;;                                                          const gchar *tagset_name);
819 ;; GdkAtom             gtk_text_buffer_register_serialize_format
820 ;;                                                         (GtkTextBuffer *buffer,
821 ;;                                                          const gchar *mime_type,
822 ;;                                                          GtkTextBufferSerializeFunc function,
823 ;;                                                          gpointer user_data,
824 ;;                                                          GDestroyNotify user_data_destroy);
825 ;; GdkAtom             gtk_text_buffer_register_serialize_tagset
826 ;;                                                         (GtkTextBuffer *buffer,
827 ;;                                                          const gchar *tagset_name);
828 ;; guint8*             (*GtkTextBufferSerializeFunc)       (GtkTextBuffer *register_buffer,
829 ;;                                                          GtkTextBuffer *content_buffer,
830 ;;                                                          const GtkTextIter *start,
831 ;;                                                          const GtkTextIter *end,
832 ;;                                                          gsize *length,
833 ;;                                                          gpointer user_data);
834 ;; guint8*             gtk_text_buffer_serialize           (GtkTextBuffer *register_buffer,
835 ;;                                                          GtkTextBuffer *content_buffer,
836 ;;                                                          GdkAtom format,
837 ;;                                                          const GtkTextIter *start,
838 ;;                                                          const GtkTextIter *end,
839 ;;                                                          gsize *length);
840 ;; void                gtk_text_buffer_unregister_deserialize_format
841 ;;                                                         (GtkTextBuffer *buffer,
842 ;;                                                          GdkAtom format);
843 ;; void                gtk_text_buffer_unregister_serialize_format
844 ;;                                                         (GtkTextBuffer *buffer,
845 ;;                                                          GdkAtom format);
846
847 ;; text tag
848
849 ;; text tag table
850
851 (defcallback gtk-text-tag-table-foreach-function :void ((tag (g-object text-tag)) (data :pointer))
852   (funcall (get-stable-pointer-value data) tag))
853
854 (defcfun (text-tag-table-add "gtk_text_tag_table_add") :void
855   (table (g-object text-tag-table))
856   (tag (g-object text-tag)))
857
858 (export 'text-tag-table-add)
859
860 (defcfun (text-tag-table-remove "gtk_text_tag_table_remove") :void
861   (table (g-object text-tag-table))
862   (tag (g-object text-tag)))
863
864 (export 'text-tag-table-remove)
865
866 (defcfun (text-tag-table-lookup "gtk_text_tag_table_lookup") (g-object text-tag)
867   (table (g-object text-tag-table))
868   (name (:string :free-to-foreign t)))
869
870 (export 'text-tag-table-lookup)
871
872 (defcfun gtk-text-tag-table-foreach :void
873   (table (g-object text-tag-table))
874   (function :pointer)
875   (data :pointer))
876
877 (defun text-tag-table-foreach (table function)
878   (with-stable-pointer (ptr function)
879     (gtk-text-tag-table-foreach table (callback gtk-text-tag-table-foreach-function) ptr)))
880
881 (export 'text-tag-table-foreach)
882
883 (defcfun (text-tag-table-size "gtk_text_tag_table_get_size") :int
884   (table (g-object text-tag-table)))
885
886 (export 'text-tag-table-size)
887
888 ;; text view
889
890 (defcfun gtk-text-view-scroll-to-mark :void
891   (text-view (g-object text-view))
892   (mark (g-object text-mark))
893   (within-margin :double)
894   (use-align :boolean)
895   (x-align :double)
896   (y-align :double))
897
898 (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))
899   (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)))
900
901 (export 'text-view-scroll-to-mark)
902
903 (defcfun gtk-text-view-scroll-to-iter :void
904   (text-view (g-object text-view))
905   (iter (g-object text-iter))
906   (within-margin :double)
907   (use-align :boolean)
908   (x-align :double)
909   (y-align :double))
910
911 (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))
912   (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)))
913
914 (export 'text-view-scroll-to-iter)
915
916 (defcfun (text-view-move-mark-onscreen "gtk_text_view_move_mark_onscreen") :boolean
917   (text-view (g-object text-view))
918   (mark (g-object text-mark)))
919
920 (export 'text-view-move-mark-onscreen)
921
922 (defcfun (text-view-place-cursor-onscreen "gtk_text_view_place_cursor_onscreen") :boolean
923   (text-view (g-object text-view)))
924
925 (export 'text-view-place-cursor-onscreen)
926
927 (defcfun gtk-text-view-get-visible-rect :void
928   (text-view (g-object text-view))
929   (visible-rect (g-boxed-foreign rectangle)))
930
931 (defun text-view-visible-rect (text-view)
932   (let ((rect (make-rectangle :x 0 :y 0 :width 0 :height 0)))
933     (gtk-text-view-get-visible-rect text-view rect)
934     rect))
935
936 (export 'text-view-visible-rect)
937
938 (defcfun gtk-text-view-get-iter-location :void
939   (text-view (g-object text-view))
940   (iter (g-boxed-foreign text-iter))
941   (location (g-boxed-foreign rectangle)))
942
943 (defun text-view-iter-location (text-view iter)
944   (let ((rect (make-rectangle :x 0 :y 0 :width 0 :height 0)))
945     (gtk-text-view-get-iter-location text-view iter rect)
946     rect))
947
948 (export 'text-view-iter-location)
949
950
951 ;; void                gtk_text_view_get_line_at_y         (GtkTextView *text_view,
952 ;;                                                          GtkTextIter *target_iter,
953 ;;                                                          gint y,
954 ;;                                                          gint *line_top);
955 ;; void                gtk_text_view_get_line_yrange       (GtkTextView *text_view,
956 ;;                                                          const GtkTextIter *iter,
957 ;;                                                          gint *y,
958 ;;                                                          gint *height);
959
960 (defcfun gtk-text-view-get-iter-at-location :void
961   (text-view (g-object text-view))
962   (iter (g-boxed-foreign text-iter))
963   (x :int)
964   (y :int))
965
966 (defun text-view-get-iter-at-location (view x y)
967   (let ((iter (make-instance 'text-iter)))
968     (gtk-text-view-get-iter-at-location view iter x y)
969     iter))
970
971 (export 'text-view-get-iter-at-location)
972
973 ;; void                gtk_text_view_get_iter_at_position  (GtkTextView *text_view,
974 ;;                                                          GtkTextIter *iter,
975 ;;                                                          gint *trailing,
976 ;;                                                          gint x,
977 ;;                                                          gint y);
978 ;; void                gtk_text_view_buffer_to_window_coords
979 ;;                                                         (GtkTextView *text_view,
980 ;;                                                          GtkTextWindowType win,
981 ;;                                                          gint buffer_x,
982 ;;                                                          gint buffer_y,
983 ;;                                                          gint *window_x,
984 ;;                                                          gint *window_y);
985
986 (defcfun gtk-text-view-window-to-buffer-coords :void
987   (text-view (g-object text-view))
988   (win text-window-type)
989   (window-x :int)
990   (window-y :int)
991   (buffer-x :pointer)
992   (buffer-y :pointer))
993
994 (defun text-view-window-to-buffer-coords (text-view win window-x window-y)
995   (with-foreign-objects ((buffer-x :int) (buffer-y :int))
996     (gtk-text-view-window-to-buffer-coords text-view win window-x window-y buffer-x buffer-y)
997     (values (mem-ref buffer-x :int)
998             (mem-ref buffer-y :int))))
999
1000 (export 'text-view-window-to-buffer-coords)
1001
1002 (defcfun gtk-text-view-get-window (g-object gdk:gdk-window)
1003   (text-view (g-object text-view))
1004   (win text-window-type))
1005
1006 (defun text-view-get-window (text-view win)
1007   (gtk-text-view-get-window text-view win))
1008
1009 (export 'text-view-get-window)
1010
1011 ;; GtkTextWindowType   gtk_text_view_get_window_type       (GtkTextView *text_view,
1012 ;;                                                          GdkWindow *window);
1013 ;; void                gtk_text_view_set_border_window_size
1014 ;;                                                         (GtkTextView *text_view,
1015 ;;                                                          GtkTextWindowType type,
1016 ;;                                                          gint size);
1017 ;; gint                gtk_text_view_get_border_window_size
1018 ;;                                                         (GtkTextView *text_view,
1019 ;;                                                          GtkTextWindowType type);
1020 ;; gboolean            gtk_text_view_forward_display_line  (GtkTextView *text_view,
1021 ;;                                                          GtkTextIter *iter);
1022 ;; gboolean            gtk_text_view_backward_display_line (GtkTextView *text_view,
1023 ;;                                                          GtkTextIter *iter);
1024 ;; gboolean            gtk_text_view_forward_display_line_end
1025 ;;                                                         (GtkTextView *text_view,
1026 ;;                                                          GtkTextIter *iter);
1027 ;; gboolean            gtk_text_view_backward_display_line_start
1028 ;;                                                         (GtkTextView *text_view,
1029 ;;                                                          GtkTextIter *iter);
1030 ;; gboolean            gtk_text_view_starts_display_line   (GtkTextView *text_view,
1031 ;;                                                          const GtkTextIter *iter);
1032 ;; gboolean            gtk_text_view_move_visually         (GtkTextView *text_view,
1033 ;;                                                          GtkTextIter *iter,
1034 ;;                                                          gint count);
1035 ;; void                gtk_text_view_add_child_at_anchor   (GtkTextView *text_view,
1036 ;;                                                          GtkWidget *child,
1037 ;;                                                          GtkTextChildAnchor *anchor);
1038
1039 (defcfun (text-view-add-child-at-anchor "gtk_text_view_add_child_at_anchor") :void
1040   (text-view g-object)
1041   (child g-object)
1042   (anchor g-object))
1043
1044 (export 'text-view-add-child-at-anchor)
1045
1046 ;;                     GtkTextChildAnchor;
1047 ;; GtkTextChildAnchor* gtk_text_child_anchor_new           (void);
1048 ;; GList*              gtk_text_child_anchor_get_widgets   (GtkTextChildAnchor *anchor);
1049 ;; gboolean            gtk_text_child_anchor_get_deleted   (GtkTextChildAnchor *anchor);
1050 ;; void                gtk_text_view_add_child_in_window   (GtkTextView *text_view,
1051 ;;                                                          GtkWidget *child,
1052 ;;                                                          GtkTextWindowType which_window,
1053 ;;                                                          gint xpos,
1054 ;;                                                          gint ypos);
1055 ;; void                gtk_text_view_move_child            (GtkTextView *text_view,
1056 ;;                                                          GtkWidget *child,
1057 ;;                                                          gint xpos,
1058 ;;                                                          gint ypos);