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