5 static int line_length(GtkTextIter
*orig
)
7 GtkTextIter iter
= *orig
;
8 while (!gtk_text_iter_ends_line(&iter
))
9 gtk_text_iter_forward_char(&iter
);
10 return gtk_text_iter_get_line_offset(&iter
);
13 static void jump(GtkTextIter
*iter
, int c
)
17 GtkTextBuffer
*buffer
= gtk_text_iter_get_buffer(iter
);
20 mark
= gtk_text_buffer_get_mark(buffer
, name
);
22 gtk_text_buffer_get_iter_at_mark(buffer
, iter
, mark
);
25 /* where: 0, 1, 2 for top, center, buttom respectively */
26 static void recenter(GtkTextView
*view
, int where
, GtkTextIter
*iter
)
30 gtk_text_view_get_visible_rect(view
, &rect
);
33 y
= rect
.y
+ rect
.height
/ 2;
36 y
= rect
.y
+ rect
.height
;
41 gtk_text_view_get_iter_at_location(view
, iter
, 0, y
);
44 static void search(struct movement
*mm
, GtkTextIter
*iter
)
46 GtkTextIter start
, end
;
50 gtk_text_iter_forward_char(&start
);
51 found
= gtk_text_iter_forward_search(&start
, mm
->arg
.s
, 0,
54 gtk_text_iter_backward_char(&start
);
55 found
= gtk_text_iter_backward_search(&end
, mm
->arg
.s
, 0,
62 static gboolean
ischar(gunichar c
, void *data
)
64 struct movement
*mm
= data
;
65 return c
== mm
->arg
.c
;
68 static void cfind(struct movement
*mm
, GtkTextIter
*iter
)
70 GtkTextIter cur
= *iter
;
71 GtkTextIter bol
= *iter
;
72 GtkTextIter eol
= *iter
;
74 gtk_text_iter_forward_to_line_end(&eol
);
75 gtk_text_iter_set_line_offset(&bol
, 0);
77 gtk_text_iter_forward_char(&cur
);
78 found
= gtk_text_iter_forward_find_char(&cur
, ischar
,
81 gtk_text_iter_backward_char(&cur
);
82 found
= gtk_text_iter_backward_find_char(&cur
, ischar
,
85 if (found
&& gtk_text_iter_compare(&bol
, &cur
) <= 0 &&
86 gtk_text_iter_compare(&eol
, &cur
) >= 0)
90 void moveiter(GtkTextView
*view
, struct movement
*mm
,
91 GtkTextIter
*iter
, GtkTextIter
*start
)
98 offset
= gtk_text_iter_get_line_offset(iter
);
99 gtk_text_iter_forward_lines(iter
, mm
->count
);
103 gtk_text_view_move_visually(view
, iter
, mm
->count
);
104 if (gtk_text_iter_get_line(iter
) !=
105 gtk_text_iter_get_line(&orig
))
109 gtk_text_iter_forward_to_line_end(iter
);
112 if (gtk_text_iter_forward_char(iter
) &&
113 gtk_text_iter_forward_word_end(iter
))
114 gtk_text_iter_backward_char(iter
);
118 if (!isspace(gtk_text_iter_get_char(iter
)))
119 gtk_text_iter_forward_word_end(iter
);
120 if (gtk_text_iter_forward_word_end(iter
))
121 gtk_text_iter_backward_word_start(iter
);
124 gtk_text_iter_backward_word_start(iter
);
127 gtk_text_iter_set_line_offset(iter
, 0);
130 gtk_text_iter_set_line_offset(iter
, 0);
131 while (isspace(gtk_text_iter_get_char(iter
)) &&
132 !gtk_text_iter_ends_line(iter
) &&
133 gtk_text_iter_forward_char(iter
))
137 gtk_text_iter_forward_to_end(iter
);
138 gtk_text_iter_set_line_offset(iter
, 0);
141 gtk_text_iter_set_line_offset(start
, 0);
142 gtk_text_iter_forward_to_line_end(iter
);
145 jump(iter
, mm
->arg
.m
);
148 recenter(view
, 0, iter
);
151 recenter(view
, 1, iter
);
154 recenter(view
, 2, iter
);
164 offset
= gtk_text_iter_get_line_offset(iter
);
165 length
= line_length(iter
);
168 if (mm
->eolfix
&& offset
== length
)
170 if (offset
< 0 || !length
)
172 gtk_text_iter_set_line_offset(iter
, offset
);
174 gtk_text_iter_forward_char(iter
);