Fix mode switch after CK_FileNext/CK_FilePrev.
[midnight-commander.git] / src / viewer / internal.h
bloba94d8fd402a87d49f34b16700cee78fa281758ea
1 #ifndef MC__VIEWER_INTERNAL_H
2 #define MC__VIEWER_INTERNAL_H
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <sys/types.h>
8 #include "lib/global.h"
10 #include "lib/search.h"
11 #include "lib/widget.h"
12 #include "lib/vfs/vfs.h" /* vfs_path_t */
14 #include "src/keybind-defaults.h" /* global_keymap_t */
15 #include "src/filemanager/dir.h" /* dir_list */
17 #include "mcviewer.h"
19 /*** typedefs(not structures) and defined constants **********************************************/
21 typedef unsigned char byte;
23 /* A width or height on the screen */
24 typedef unsigned int screen_dimen;
26 extern const off_t INVALID_OFFSET;
27 extern const off_t OFFSETTYPE_MAX;
29 /*** enums ***************************************************************************************/
31 /* data sources of the view */
32 enum view_ds
34 DS_NONE, /* No data available */
35 DS_STDIO_PIPE, /* Data comes from a pipe using popen/pclose */
36 DS_VFS_PIPE, /* Data comes from a piped-in VFS file */
37 DS_FILE, /* Data comes from a VFS file */
38 DS_STRING /* Data comes from a string in memory */
41 enum ccache_type
43 CCACHE_OFFSET,
44 CCACHE_LINECOL
47 typedef enum
49 NROFF_TYPE_NONE = 0,
50 NROFF_TYPE_BOLD = 1,
51 NROFF_TYPE_UNDERLINE = 2
52 } nroff_type_t;
54 /*** structures declarations (and typedefs of structures)*****************************************/
56 /* A node for building a change list on change_list */
57 struct hexedit_change_node
59 struct hexedit_change_node *next;
60 off_t offset;
61 byte value;
64 struct area
66 screen_dimen top, left;
67 screen_dimen height, width;
70 /* A cache entry for mapping offsets into line/column pairs and vice versa.
71 * cc_offset, cc_line, and cc_column are the 0-based values of the offset,
72 * line and column of that cache entry. cc_nroff_column is the column
73 * corresponding to cc_offset in nroff mode.
75 typedef struct
77 off_t cc_offset;
78 off_t cc_line;
79 off_t cc_column;
80 off_t cc_nroff_column;
81 } coord_cache_entry_t;
83 typedef struct
85 size_t size;
86 size_t capacity;
87 coord_cache_entry_t **cache;
88 } coord_cache_t;
90 struct mcview_nroff_struct;
92 struct mcview_struct
94 Widget widget;
96 vfs_path_t *filename_vpath; /* Name of the file */
97 vfs_path_t *workdir_vpath; /* Name of the working directory */
98 char *command; /* Command used to pipe data in */
100 enum view_ds datasource; /* Where the displayed data comes from */
102 /* stdio pipe data source */
103 FILE *ds_stdio_pipe; /* Output of a shell command */
105 /* vfs pipe data source */
106 int ds_vfs_pipe; /* Non-seekable vfs file descriptor */
108 /* vfs file data source */
109 int ds_file_fd; /* File with random access */
110 off_t ds_file_filesize; /* Size of the file */
111 off_t ds_file_offset; /* Offset of the currently loaded data */
112 byte *ds_file_data; /* Currently loaded data */
113 size_t ds_file_datalen; /* Number of valid bytes in file_data */
114 size_t ds_file_datasize; /* Number of allocated bytes in file_data */
116 /* string data source */
117 byte *ds_string_data; /* The characters of the string */
118 size_t ds_string_len; /* The length of the string */
120 /* Growing buffers information */
121 gboolean growbuf_in_use; /* Use the growing buffers? */
122 GPtrArray *growbuf_blockptr; /* Pointer to the block pointers */
123 size_t growbuf_lastindex; /* Number of bytes in the last page of the
124 growing buffer */
125 gboolean growbuf_finished; /* TRUE when all data has been read. */
127 /* Editor modes */
128 gboolean hex_mode; /* Hexview or Hexedit */
129 gboolean hexedit_mode; /* Hexedit */
130 gboolean hexview_in_text; /* Is the hexview cursor in the text area? */
131 gboolean text_nroff_mode; /* Nroff-style highlighting */
132 gboolean text_wrap_mode; /* Wrap text lines to fit them on the screen */
133 gboolean magic_mode; /* Preprocess the file using external programs */
134 gboolean hexedit_lownibble; /* Are we editing the last significant nibble? */
135 gboolean locked; /* We hold lock on current file */
137 gboolean utf8; /* It's multibyte file codeset */
139 coord_cache_t *coord_cache; /* Cache for mapping offsets to cursor positions */
141 /* Display information */
142 screen_dimen dpy_frame_size; /* Size of the frame surrounding the real viewer */
143 off_t dpy_start; /* Offset of the displayed data */
144 off_t dpy_end; /* Offset after the displayed data */
145 off_t dpy_text_column; /* Number of skipped columns in non-wrap
146 * text mode */
147 off_t hex_cursor; /* Hexview cursor position in file */
148 screen_dimen cursor_col; /* Cursor column */
149 screen_dimen cursor_row; /* Cursor row */
150 struct hexedit_change_node *change_list; /* Linked list of changes */
151 struct area status_area; /* Where the status line is displayed */
152 struct area ruler_area; /* Where the ruler is displayed */
153 struct area data_area; /* Where the data is displayed */
155 int dirty; /* Number of skipped updates */
156 gboolean dpy_bbar_dirty; /* Does the button bar need to be updated? */
158 /* Mode variables */
159 int bytes_per_line; /* Number of bytes per line in hex mode */
161 /* Search variables */
162 off_t search_start; /* First character to start searching from */
163 off_t search_end; /* Length of found string or 0 if none was found */
165 /* Markers */
166 int marker; /* mark to use */
167 off_t marks[10]; /* 10 marks: 0..9 */
169 off_t update_steps; /* The number of bytes between percent
170 * increments */
171 off_t update_activate; /* Last point where we updated the status */
173 /* converter for translation of text */
174 GIConv converter;
176 /* handle of search engine */
177 mc_search_t *search;
178 gchar *last_search_string;
179 struct mcview_nroff_struct *search_nroff_seq;
181 int search_numNeedSkipChar;
183 GArray *saved_bookmarks;
185 dir_list *dir; /* List of current directory files
186 * to handle CK_FileNext and CK_FilePrev commands */
187 int *dir_count; /* Number of files in dir structure.
188 * Pointer is used here as reference to WPanel::count */
189 int *dir_idx; /* Index of current file in dir structure.
190 * Pointer is used here as reference to WPanel::count */
191 vfs_path_t *ext_script; /* Temporary script file created by regex_command_for() */
194 typedef struct mcview_nroff_struct
196 mcview_t *view;
197 off_t index;
198 int char_width;
199 int current_char;
200 nroff_type_t type;
201 nroff_type_t prev_type;
202 } mcview_nroff_t;
204 typedef struct mcview_search_options_t
206 mc_search_type_t type;
207 gboolean case_sens;
208 gboolean backwards;
209 gboolean whole_words;
210 gboolean all_codepages;
211 } mcview_search_options_t;
213 /*** global variables defined in .c file *********************************************************/
215 extern mcview_search_options_t mcview_search_options;
217 /*** declarations of public functions ************************************************************/
219 /* actions_cmd.c: */
220 cb_ret_t mcview_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data);
221 cb_ret_t mcview_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
222 void *data);
224 /* coord_cache.c: */
225 coord_cache_t *coord_cache_new (void);
226 void coord_cache_free (coord_cache_t * cache);
228 #ifdef MC_ENABLE_DEBUGGING_CODE
229 void mcview_ccache_dump (mcview_t * view);
230 #endif
232 void mcview_ccache_lookup (mcview_t * view, coord_cache_entry_t * coord,
233 enum ccache_type lookup_what);
235 /* datasource.c: */
236 void mcview_set_datasource_none (mcview_t *);
237 off_t mcview_get_filesize (mcview_t *);
238 void mcview_update_filesize (mcview_t * view);
239 char *mcview_get_ptr_file (mcview_t *, off_t);
240 char *mcview_get_ptr_string (mcview_t *, off_t);
241 int mcview_get_utf (mcview_t *, off_t, int *, gboolean *);
242 gboolean mcview_get_byte_string (mcview_t *, off_t, int *);
243 gboolean mcview_get_byte_none (mcview_t *, off_t, int *);
244 void mcview_set_byte (mcview_t *, off_t, byte);
245 void mcview_file_load_data (mcview_t *, off_t);
246 void mcview_close_datasource (mcview_t *);
247 void mcview_set_datasource_file (mcview_t *, int, const struct stat *);
248 gboolean mcview_load_command_output (mcview_t *, const char *);
249 void mcview_set_datasource_vfs_pipe (mcview_t *, int);
250 void mcview_set_datasource_string (mcview_t *, const char *);
252 /* dialog.c: */
253 gboolean mcview_dialog_search (mcview_t * view);
254 gboolean mcview_dialog_goto (mcview_t * view, off_t * offset);
256 /* display.c: */
257 void mcview_update (mcview_t * view);
258 void mcview_display (mcview_t * view);
259 void mcview_compute_areas (mcview_t * view);
260 void mcview_update_bytes_per_line (mcview_t * view);
261 void mcview_display_toggle_ruler (mcview_t * view);
262 void mcview_display_clean (mcview_t * view);
263 void mcview_display_ruler (mcview_t * view);
264 void mcview_percent (mcview_t * view, off_t p);
266 /* growbuf.c: */
267 void mcview_growbuf_init (mcview_t * view);
268 void mcview_growbuf_free (mcview_t * view);
269 off_t mcview_growbuf_filesize (mcview_t * view);
270 void mcview_growbuf_read_until (mcview_t * view, off_t p);
271 gboolean mcview_get_byte_growing_buffer (mcview_t * view, off_t p, int *);
272 char *mcview_get_ptr_growing_buffer (mcview_t * view, off_t p);
274 /* hex.c: */
275 void mcview_display_hex (mcview_t * view);
276 gboolean mcview_hexedit_save_changes (mcview_t * view);
277 void mcview_toggle_hexedit_mode (mcview_t * view);
278 void mcview_hexedit_free_change_list (mcview_t * view);
279 void mcview_enqueue_change (struct hexedit_change_node **, struct hexedit_change_node *);
281 /* lib.c: */
282 void mcview_toggle_magic_mode (mcview_t * view);
283 void mcview_toggle_wrap_mode (mcview_t * view);
284 void mcview_toggle_nroff_mode (mcview_t * view);
285 void mcview_toggle_hex_mode (mcview_t * view);
286 gboolean mcview_ok_to_quit (mcview_t * view);
287 void mcview_init (mcview_t * view);
288 void mcview_done (mcview_t * view);
289 void mcview_select_encoding (mcview_t * view);
290 void mcview_set_codeset (mcview_t * view);
291 void mcview_show_error (mcview_t * view, const char *error);
292 off_t mcview_bol (mcview_t * view, off_t current, off_t limit);
293 off_t mcview_eol (mcview_t * view, off_t current, off_t limit);
294 char *mcview_get_title (const WDialog * h, size_t len);
296 /* move.c */
297 void mcview_move_up (mcview_t *, off_t);
298 void mcview_move_down (mcview_t *, off_t);
299 void mcview_move_left (mcview_t *, off_t);
300 void mcview_move_right (mcview_t *, off_t);
301 void mcview_moveto_top (mcview_t *);
302 void mcview_moveto_bottom (mcview_t *);
303 void mcview_moveto_bol (mcview_t *);
304 void mcview_moveto_eol (mcview_t *);
305 void mcview_moveto_offset (mcview_t *, off_t);
306 void mcview_moveto (mcview_t *, off_t, off_t);
307 void mcview_coord_to_offset (mcview_t *, off_t *, off_t, off_t);
308 void mcview_offset_to_coord (mcview_t *, off_t *, off_t *, off_t);
309 void mcview_place_cursor (mcview_t *);
310 void mcview_moveto_match (mcview_t *);
312 /* nroff.c: */
313 void mcview_display_nroff (mcview_t * view);
314 int mcview__get_nroff_real_len (mcview_t * view, off_t, off_t p);
316 mcview_nroff_t *mcview_nroff_seq_new_num (mcview_t * view, off_t p);
317 mcview_nroff_t *mcview_nroff_seq_new (mcview_t * view);
318 void mcview_nroff_seq_free (mcview_nroff_t **);
319 nroff_type_t mcview_nroff_seq_info (mcview_nroff_t *);
320 int mcview_nroff_seq_next (mcview_nroff_t *);
321 int mcview_nroff_seq_prev (mcview_nroff_t *);
324 /* plain.c: */
325 void mcview_display_text (mcview_t *);
327 /* search.c: */
328 mc_search_cbret_t mcview_search_cmd_callback (const void *user_data, gsize char_offset,
329 int *current_char);
330 int mcview_search_update_cmd_callback (const void *, gsize);
331 void mcview_do_search (mcview_t * view);
333 /*** inline functions ****************************************************************************/
335 #include "inlines.h"
337 #endif /* MC__VIEWER_INTERNAL_H */