Strings corrections from Malcolm Parsons
[elinks.git] / src / viewer / text / vs.c
blobd0bbdf522dbe150eff39376ed583bb933ab75e72
1 /** View state manager
2 * @file */
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
8 #include <stdlib.h>
9 #include <string.h>
11 #include "elinks.h"
13 #include "document/document.h"
14 #include "document/view.h"
15 #include "ecmascript/ecmascript.h"
16 #include "protocol/uri.h"
17 #include "session/location.h"
18 #include "session/session.h"
19 #include "util/memory.h"
20 #include "util/string.h"
21 #include "viewer/text/form.h"
22 #include "viewer/text/link.h"
23 #include "viewer/text/view.h"
24 #include "viewer/text/vs.h"
27 /** @relates view_state */
28 void
29 init_vs(struct view_state *vs, struct uri *uri, int plain)
31 memset(vs, 0, sizeof(*vs));
32 vs->current_link = -1;
33 vs->old_current_link = -1;
34 vs->plain = plain;
35 vs->uri = uri ? get_uri_reference(uri) : NULL;
36 vs->did_fragment = !uri->fragmentlen;
37 #ifdef CONFIG_ECMASCRIPT
38 /* If we ever get to render this vs, give it an interpreter. */
39 vs->ecmascript_fragile = 1;
40 #endif
41 init_list(vs->forms);
44 /** @relates view_state */
45 void
46 destroy_vs(struct view_state *vs, int blast_ecmascript)
48 int i;
50 for (i = 0; i < vs->form_info_len; i++)
51 mem_free_if(vs->form_info[i].value);
53 if (vs->uri) done_uri(vs->uri);
54 mem_free_if(vs->form_info);
55 free_list(vs->forms);
56 #ifdef CONFIG_ECMASCRIPT
57 if (blast_ecmascript && vs->ecmascript)
58 ecmascript_put_interpreter(vs->ecmascript);
59 #endif
60 if (vs->doc_view) {
61 vs->doc_view->vs = NULL;
62 vs->doc_view = NULL;
66 /** @relates view_state */
67 void
68 copy_vs(struct view_state *dst, struct view_state *src)
70 struct form_view *fv;
72 copy_struct(dst, src);
74 /* We do not copy ecmascript stuff around since it's specific for
75 * a single location, offsprings (followups and so) nedd their own. */
76 #ifdef CONFIG_ECMASCRIPT
77 dst->ecmascript = NULL;
78 /* If we ever get to render this vs, give it an interpreter. */
79 dst->ecmascript_fragile = 1;
80 #endif
82 /* Clean as a baby. */
83 dst->doc_view = NULL;
85 dst->uri = get_uri_reference(src->uri);
86 /* Redo fragment if there is one? */
87 dst->did_fragment = !src->uri->fragmentlen;
89 init_list(dst->forms);
90 foreach (fv, src->forms) {
91 struct form_view *newfv = mem_calloc(1, sizeof(*newfv));
93 if (!newfv) continue;
94 newfv->form_num = fv->form_num;
95 /* We do leave out the ECMAScript object intentionally. */
96 add_to_list(dst->forms, newfv);
99 if (src->form_info_len) {
100 dst->form_info = mem_alloc(src->form_info_len
101 * sizeof(*src->form_info));
102 if (dst->form_info) {
103 int i;
105 memcpy(dst->form_info, src->form_info,
106 src->form_info_len * sizeof(*src->form_info));
107 for (i = 0; i < src->form_info_len; i++) {
108 struct form_state *srcfs = &src->form_info[i];
109 struct form_state *dstfs = &dst->form_info[i];
111 if (srcfs->value)
112 dstfs->value = stracpy(srcfs->value);
113 /* XXX: This makes it O(nm). */
114 dstfs->form_view =
115 srcfs->form_view
116 ? find_form_view_in_vs(dst, srcfs->form_view->form_num)
117 : NULL;
123 void
124 check_vs(struct document_view *doc_view)
126 struct view_state *vs = doc_view->vs;
128 int_upper_bound(&vs->current_link, doc_view->document->nlinks - 1);
130 if (vs->current_link != -1) {
131 if (!current_link_is_visible(doc_view)) {
132 struct link *links = doc_view->document->links;
134 set_pos_x(doc_view, &links[vs->current_link]);
135 set_pos_y(doc_view, &links[vs->current_link]);
137 } else {
138 find_link_page_down(doc_view);
142 void
143 next_frame(struct session *ses, int p)
145 struct view_state *vs;
146 struct document_view *doc_view;
147 int n;
149 if (!have_location(ses)
150 || (ses->doc_view && !document_has_frames(ses->doc_view->document)))
151 return;
153 ses->navigate_mode = NAVIGATE_LINKWISE;
155 vs = &cur_loc(ses)->vs;
157 n = 0;
158 foreach (doc_view, ses->scrn_frames) {
159 if (!document_has_frames(doc_view->document))
160 n++;
163 vs->current_link += p;
164 if (!n) n = 1;
165 while (vs->current_link < 0) vs->current_link += n;
166 vs->current_link %= n;