1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-28 01:35:32 +00:00
elinks/src/terminal/window.h
Witold Filipczyk a67188413c [lists] LIST_HEAD -> LIST_HEAD_EL to not clash with libevent's LIST_HEAD. Also added curl implementation of ftpes and sftp
Implementation of ftpes and sftp is based on curl's hiperfifo example. It requires libevent.
ftpes only encrypts control channel. There were problems when both control and data were encrypted. It stucked on SIZE.
Only successful connections work, errors are not handled properly.
2023-06-19 18:43:53 +02:00

116 lines
3.5 KiB
C

#ifndef EL__TERMINAL_WINDOW_H
#define EL__TERMINAL_WINDOW_H
#include "util/lists.h"
#ifdef __cplusplus
extern "C" {
#endif
struct dialog_data;
struct term_event;
struct terminal;
struct window;
enum window_type {
/** Normal windows.
* Used for things like dialogs. The default type when adding windows
* with add_window(). */
WINDOW_NORMAL,
/** Tab windows.
* Tabs are a separate session and has separate history, current
* document and action-in-progress .. basically a separate browsing
* state. */
WINDOW_TAB,
};
typedef void (window_handler_T)(struct window *, struct term_event *);
/** A window in the terminal screen. This structure does not know the
* position and size of the window, and no functions are provided for
* drawing into a window. Instead, when window.handler draws the
* window, it should decide the position and size of the window, and
* then draw directly to the terminal, taking care not to draw outside
* the window. Windows generally do not have their own coordinate
* systems; they get mouse events in the coordinate system of the
* terminal. */
struct window {
LIST_HEAD_EL(struct window); /*!< terminal.windows is the sentinel. */
/** Whether this is a normal window or a tab window. */
enum window_type type;
/** The window event handler */
window_handler_T *handler;
/** For tab windows the session is stored in @c data.
* For normal windows it can contain dialog data.
* It is free()'d by delete_window() */
void *data;
/** The terminal (and screen) that hosts the window */
struct terminal *term;
/** For ::WINDOW_TAB, the position and size in the tab bar.
* Updated while the tab bar is being drawn, and read if the
* user clicks there with the mouse. */
int xpos, width;
/** The position of something that has focus in the window.
* Any popup menus are drawn near this position.
* In tab windows, during ::NAVIGATE_CURSOR_ROUTING, this is
* also the position of the cursor that the user can move;
* there is no separate cursor position for each frame.
* In dialog boxes, this is typically the top left corner of
* the focused widget, while the cursor is somewhere within
* the widget.
* @see set_window_ptr, get_parent_ptr, set_cursor */
int x, y;
/** For delayed tab resizing */
unsigned int resize:1;
};
/** Which windows redraw_windows() should redraw. */
enum windows_to_redraw {
/** Redraw the windows in front of the specified window,
* but not the specified window itself. */
REDRAW_IN_FRONT_OF_WINDOW,
/** Redraw the specified window, and the windows in front of
* it. */
REDRAW_WINDOW_AND_FRONT,
/** Redraw the windows behind the specified window,
* but not the specified window itself.
* Do that even if terminal.redrawing is TREDRAW_BUSY. */
REDRAW_BEHIND_WINDOW,
};
void redraw_windows(enum windows_to_redraw, struct window *);
void add_window(struct terminal *, window_handler_T, void *);
void delete_window(struct window *);
void delete_window_ev(struct window *, struct term_event *ev);
#define set_window_ptr(window, x_, y_) do { (window)->x = (x_); (window)->y = (y_); } while (0)
void set_dlg_window_ptr(struct dialog_data *dlg_data, struct window *window, int x, int y);
void get_parent_ptr(struct window *, int *, int *);
void add_empty_window(struct terminal *, void (*)(void *), void *);
#if CONFIG_DEBUG
void assert_window_stacking(struct terminal *);
#else
#define assert_window_stacking(t) ((void) (t))
#endif
#ifdef CONFIG_SCRIPTING_SPIDERMONKEY
int would_window_receive_keypresses(const struct window *);
#endif
#ifdef __cplusplus
}
#endif
#endif