1 #ifndef EL__SESSION_SESSION_H
2 #define EL__SESSION_SESSION_H
4 #include "bfu/dialog.h"
5 #include "cache/cache.h"
6 #include "main/timer.h" /* timer_id_T */
7 #include "network/state.h"
8 #include "session/download.h"
9 #include "session/history.h"
10 #include "util/lists.h"
11 #include "viewer/text/vs.h"
16 struct session_status
;
23 /* Used by delayed_open and delayed_goto_uri_frame. */
27 unsigned char *target
;
30 enum remote_session_flags
{
31 SES_REMOTE_NEW_TAB
= 1,
32 SES_REMOTE_NEW_WINDOW
= 2,
33 SES_REMOTE_CURRENT_TAB
= 4,
34 SES_REMOTE_PROMPT_URL
= 8,
36 SES_REMOTE_ADD_BOOKMARK
= 32,
37 SES_REMOTE_INFO_BOX
= 64,
40 /* This is generic frame descriptor, meaningful mainly for ses_*_frame*(). */
42 LIST_HEAD(struct frame
);
50 /* Use for keyboard prefixes. */
52 /* This is the repeat count being inserted by user so far. It is stored
53 * intermediately per-session. */
57 /* If the previous key was a mark prefix, this describes what kind of
58 * action are we supposed to do when we receive the next key. */
59 enum { KP_MARK_NOTHING
, KP_MARK_SET
, KP_MARK_GOTO
} mark
;
65 /* This describes, what are we trying to do right now. We pass this around so
66 * that we can use generic scheduler routines and when the control will get
67 * back to our subsystem, we will know what are we up to. */
78 /* TODO: union --pasky */
81 struct location
*location
;
85 struct session_status
{
86 unsigned int show_tabs_bar
:1;
87 unsigned int show_status_bar
:1;
88 unsigned int show_title_bar
:1;
90 int force_show_status_bar
:2;
91 int force_show_title_bar
:2;
93 unsigned int set_window_title
:1;
94 unsigned char *last_title
;
95 #ifdef CONFIG_ECMASCRIPT
96 unsigned char *window_status
;
100 unsigned int show_leds
:1;
101 struct led_panel leds
;
103 struct led
*insert_mode_led
;
104 struct led
*ecmascript_led
;
105 struct led
*popup_led
;
107 /* Has the tab been visited yet. */
108 unsigned int visited
:1;
110 /* Is processing file requests. */
111 unsigned int processing_file_requests
:1;
112 unsigned int show_tabs_bar_at_top
:1;
123 NAVIGATE_CURSOR_ROUTING
,
126 /* This is one of the building stones of ELinks architecture --- this structure
127 * carries information about the specific ELinks session. Each tab (thus, at
128 * least one per terminal, in the normal case) has its own session. Session
129 * describes mainly the current browsing and control state, from the currently
130 * viewed document through the browsing history of this session to the status
131 * bar information. */
133 LIST_HEAD(struct session
);
136 /* The vital session data */
141 /* Browsing history */
143 struct ses_history history
;
146 /* The current document */
148 struct list_head more_files
; /* -> struct file_to_load */
150 struct download loading
;
151 struct uri
*loading_uri
;
153 enum cache_mode reloadlevel
;
156 struct document_view
*doc_view
;
157 struct list_head scrn_frames
; /* -> struct document_view */
159 struct uri
*download_uri
;
161 /* The URI which is the referrer to the current loaded document or NULL
162 * if there are no referrer. */
163 /* The @referrer members sole purpose is to have the information handy
164 * when loading URIs. It is not 'filtered' in anyway at this level only
165 * at the lower ones. */
166 struct uri
*referrer
;
169 /* The current action-in-progress selector */
171 struct session_task task
;
174 /* The current browsing state */
176 int search_direction
;
177 struct kbdprefix kbdprefix
;
179 timer_id_T display_timer
;
181 /* The text input form insert mode. It is a tristate controlled by the
182 * boolean document.browse.forms.insert_mode option. When disabled we
183 * use mode less insertion and we always insert stuff into the text
184 * input field. When enabled it is possible to switch insertion on and
185 * off using ACT_EDIT_ENTER and *_CANCEL. */
186 enum insert_mode insert_mode
;
188 enum navigate_mode navigate_mode
;
190 unsigned char *search_word
;
191 unsigned char *last_search_word
;
194 /* The possibly running type queries (what-to-do-with-that-file?) */
195 struct list_head type_queries
; /* -> struct type_query */
197 /* The info for status displaying */
198 struct session_status status
;
201 extern struct list_head sessions
; /* -> struct session */
202 extern enum remote_session_flags remote_session_flags
;
204 /* This returns a pointer to the current location inside of the given session.
205 * That's nice for encapsulation and alrady paid out once ;-). */
206 #define cur_loc(x) ((x)->history.current)
208 /* Return if we have anything being loaded in this session already. */
210 have_location(struct session
*ses
) {
211 return !!cur_loc(ses
);
214 /* Swaps the current session referrer with the new one passed as @referrer */
215 /* @referrer may be NULL */
216 void set_session_referrer(struct session
*ses
, struct uri
*referrer
);
219 print_error_dialog(struct session
*ses
, enum connection_state state
,
220 struct uri
*uri
, enum connection_priority priority
);
222 void process_file_requests(struct session
*);
224 struct string
*encode_session_info(struct string
*info
, struct list_head
*url_list
);
226 /* Returns zero if the info was remote sessions or if it failed to create any
228 int decode_session_info(struct terminal
*term
, struct terminal_info
*info
);
230 /* Registers a base session and returns it's id. Value <= 0 means error. */
232 add_session_info(struct session
*ses
, struct uri
*uri
, struct uri
*referrer
,
233 enum cache_mode cache_mode
, enum task_type task
);
235 void done_saved_session_info(void);
237 struct session
*init_session(struct session
*ses
, struct terminal
*term
,
238 struct uri
*uri
, int in_background
);
240 void doc_loading_callback(struct download
*, struct session
*);
242 void abort_loading(struct session
*, int);
243 void reload(struct session
*, enum cache_mode
);
244 void load_frames(struct session
*, struct document_view
*);
246 struct frame
*ses_find_frame(struct session
*, unsigned char *);
248 void free_files(struct session
*);
249 void display_timer(struct session
*ses
);
251 /* session_is_loading() is like !!get_current_download() but doesn't take
252 * @req_sent into account. */
253 struct download
*get_current_download(struct session
*ses
);
254 int session_is_loading(struct session
*ses
);
256 /* Information about the current document */
257 unsigned char *get_current_url(struct session
*, unsigned char *, size_t);
258 unsigned char *get_current_title(struct session
*, unsigned char *, size_t);
260 struct link
*get_current_session_link(struct session
*ses
);
261 struct link
*get_current_link_in_view(struct document_view
*doc_view
);
262 unsigned char *get_current_link_url(struct session
*, unsigned char *, size_t);
263 unsigned char *get_current_link_name(struct session
*, unsigned char *, size_t);
265 extern struct list_head questions_queue
;
266 void add_questions_entry(void (*callback
)(struct session
*, void *), void *data
);
267 void check_questions_queue(struct session
*ses
);
269 unsigned char *get_homepage_url(void);
271 /* Returns current keyboard repeat count and reset it. */
272 int eat_kbd_repeat_count(struct session
*ses
);