home · contact · privacy
1708fab1432b31f1bac6b1aef0acd8e0e41ac319
[plomrogue] / src / client / windows.h
1 /* src/client/windows.h
2  *
3  * A tiled window manager for the terminal.
4  *
5  * It provides a virtual screen that can be scrolled horizontally and may carry
6  * any number of windows to be appeared, disappeared, resized and moved around.
7  * They have borders and a title bar and are positioned automatically.
8  *
9  * Windows can be any width between 1 and 2^16 cells. The virtual screen grows
10  * with them as needed -- but only horizontally and only up to 2^16 cells. Their
11  * height is limited by the height of the terminal screen (maximum 2^16 cells).
12  *
13  * Windows' positioning can be influenced only indirectly: by resizing them, and
14  * by shifting their relative position inside the (currently invisible) chain
15  * that the window manager treats their plurality as. The first window goes into
16  * the top left corner of the virtual screen. Further windows are fitted as
17  * left-aligned as possible below their (chain-wise) closest predecessor that
18  * thrones over enough space to contain them and that is open to the right. If
19  * that fails, they're fitted up-right to the window with the rightmost border.
20  *
21  * TODO: Think up a more intuitive window positioning algorithm.
22  */
23
24 #ifndef WINDOWS_H
25 #define WINDOWS_H
26
27 #include <ncurses.h> /* WINDOW, chtype */
28 #include <stdint.h> /* uint8_t, int16_t, uint16_t, uint32_t */
29 #include "../common/yx_uint16.h" /* yx_uint16 struct */
30 #include "keybindings.h" /* struct KeyBindingDB */
31
32
33
34 struct WinDB
35 {
36     WINDOW * t_screen; /* ncurses' pointer to the terminal screen */
37     WINDOW * v_screen; /* virtual screen (ncurses pad) */
38     struct Win * wins; /* array of windows */
39     struct yx_uint16 v_screen_size; /* virtual screen size */
40     char * legal_ids; /* ids allowed to be used */
41     char * ids; /* all windows' ids, followed by \0 */
42     char * order; /* visible windows' id's order, followed by \0 */
43     uint16_t v_screen_offset; /* how many cells v_screen view moved rightwards*/
44     char active; /* id of window selected as active */
45 };
46
47 struct Win
48 {
49     struct KeyBindingDB kb; /* window-specific keybindings */
50     char * title; /* title to be used in window title bar */
51     struct yx_uint16 target_center; /* saves .center when toggling .view */
52     struct yx_uint16 frame_size; /* size of window/frame to see winmap through*/
53     struct yx_uint16 start; /* upper left corner of window in v_screen */
54     struct yx_uint16 center; /* winnap cell to center frame on if < winmap */
55     struct yx_uint16 winmap_size; /* delimits .winmap, sorts it into lines */
56     chtype * winmap; /* window content in sequence of chtype's to write */
57     int16_t target_height; /* window size / .frame_size description in config */
58     int16_t target_width;  /* file format, i.e. values <= 0 may be used      */
59     char id; /* Win identifier; also maps to default window drawing function. */
60     uint8_t target_height_type; /* 0: read .height/.width as positive size; */
61     uint8_t target_width_type;  /* 1: as negative diff to v_screen size     */
62     uint8_t linebreak; /* linebreaking modes: 0: wide; 1: long; 2: compact */
63     uint8_t view; /* window view mode: 0: use .id- set default draw function */
64 };                /* 1/2: use one of the two config view draw function */
65
66
67
68 /* Get position of id "c" in world.winDB.order*/
69 extern uint8_t get_win_pos_in_order(char c);
70
71 /* Get Win after window identified by "c" or NULL if there is none. */
72 extern struct Win * get_win_after(char c);
73
74 /* Return yx offset to focus map of "mapsize" on "position" in "frame_size". */
75 extern uint16_t center_offset(uint16_t position,
76                               uint32_t mapsize, uint32_t frame_size);
77
78 /* Get Win of "id". */
79 extern struct Win * get_win_by_id(char id);
80
81 /* Read/write individual Win (identified by "c") and world.winDB.order /
82  * world.winDB.active from/to "file" up to the world.delim delimiter. Use "line"
83  * and "linemax" as expected by try_fgets().
84  *
85  * Note that read_winconf_from_file() returns 1 on success and 0 if it detects
86  * having found the end of the valid interface configuration file by either
87  * hitting a EOF or a newline (so empty newlines at the end of the file are ok).
88  *
89  * Note that read_order_wins_visible_active() only reads the promised values
90  * into pointers for temporary storage. This is due to the order in which window
91  * data is initialized: winDB.order and winDB.active should only be set when all
92  * windows have been initialized, so cleaning up on error is not confused.
93  */
94 extern uint8_t read_winconf_from_file(char * line, uint32_t linemax,
95                                       FILE * file);
96 extern void write_winconf_of_id_to_file(FILE * file, char c);
97 extern void read_order_wins_visible_active(char * line, uint32_t linemax,
98                                            FILE * file, char ** tmp_order,
99                                            char * tmp_active);
100 extern void write_order_wins_visible_active(FILE * file);
101
102 /* Builds virtual sreen from .t_screen's size, fits win's sizes to them.*/
103 extern void make_v_screen_and_init_win_sizes();
104
105 /* Free all winDB data. */
106 extern void free_winDB();
107
108 /* The SIGWINCH handler winch_called() merely sets world.winch to 1. This info
109  * is used by io_loop() to call reset_windows_on_winch(), which adapts the
110  * currently loaded interface configuration to the new .t_screen size.
111  */
112 extern void winch_called();
113 extern void reset_windows_on_winch();
114
115 /* Draw .v_screen and its windows. Add scroll hints where edges of .t_screen hit
116  * .non-edges inside the virtual screen. Then update .t_screen.
117  */
118 extern void draw_all_wins();
119
120
121
122 #endif