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