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 */
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;
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;
44 /** @relates view_state */
46 destroy_vs(struct view_state
*vs
, int blast_ecmascript
)
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
);
56 #ifdef CONFIG_ECMASCRIPT
57 if (blast_ecmascript
&& vs
->ecmascript
)
58 ecmascript_put_interpreter(vs
->ecmascript
);
61 vs
->doc_view
->vs
= NULL
;
66 /** @relates view_state */
68 copy_vs(struct view_state
*dst
, struct view_state
*src
)
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;
82 /* Clean as a baby. */
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
));
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
) {
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
];
112 dstfs
->value
= stracpy(srcfs
->value
);
113 /* XXX: This makes it O(nm). */
116 ? find_form_view_in_vs(dst
, srcfs
->form_view
->form_num
)
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
]);
138 find_link_page_down(doc_view
);
143 next_frame(struct session
*ses
, int p
)
145 struct view_state
*vs
;
146 struct document_view
*doc_view
;
149 if (!have_location(ses
)
150 || (ses
->doc_view
&& !document_has_frames(ses
->doc_view
->document
)))
153 ses
->navigate_mode
= NAVIGATE_LINKWISE
;
155 vs
= &cur_loc(ses
)->vs
;
158 foreach (doc_view
, ses
->scrn_frames
) {
159 if (!document_has_frames(doc_view
->document
))
163 vs
->current_link
+= p
;
165 while (vs
->current_link
< 0) vs
->current_link
+= n
;
166 vs
->current_link
%= n
;