1 /*
2  * dselect - Debian package maintenance user interface
3  * dselect.h - external definitions for this program
4  *
5  * Copyright © 1994,1995 Ian Jackson <ijackson@chiark.greenend.org.uk>
6  * Copyright © 2001 Wichert Akkerman <wakkerma@debian.org>
7  *
8  * This is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #ifndef DSELECT_H
23 #define DSELECT_H
24 
25 #include <signal.h>
26 
27 #include <algorithm>
28 
29 using std::min;
30 using std::max;
31 
32 #include <dpkg/debug.h>
33 
34 #include "dselect-curses.h"
35 
36 #define DSELECT		"dselect"
37 
38 #define TOTAL_LIST_WIDTH 180
39 #define MAX_DISPLAY_INFO 120
40 
41 struct helpmenuentry {
42   char key;
43   const struct helpmessage *msg;
44 };
45 
46 struct keybindings;
47 
48 enum screenparts {
49 	background,
50 	list,
51 	listsel,
52 	title,
53 	thisstate,
54 	selstate,
55 	selstatesel,
56 	colheads,
57 	query,
58 	info_body,
59 	info_head,
60 	whatinfo,
61 	helpscreen,
62 	numscreenparts,
63 };
64 
65 struct column {
columncolumn66 	column(): title(nullptr), x(0), width(0) {};
blankcolumn67 	void blank() { title = nullptr; x = 0; width = 0; };
68 
69 	const char *title;
70 	int x;
71 	int width;
72 };
73 
74 class baselist {
75 protected:
76   // Screen dimensions &c.
77   int xmax, ymax;
78   int title_height, colheads_height, list_height;
79   int thisstate_height, info_height, whatinfo_height;
80   int colheads_row, thisstate_row, info_row, whatinfo_row, list_row;
81 
82   int part_attr[numscreenparts];
83 
84   int gap_width;
85   int col_cur_x;
86   int total_width;
87 
88   void add_column(column &col, const char *title, int width);
89   void end_column(column &col, const char *title);
90   void draw_column_head(column &col);
91   void draw_column_sep(column &col, int y);
92   void draw_column_item(column &col, int y, const char *item);
93 
94   // (n)curses stuff
95   WINDOW *listpad, *infopad, *colheadspad, *thisstatepad;
96   WINDOW *titlewin, *whatinfowin, *querywin;
97   // If listpad is null, then we have not started to display yet, and
98   // so none of the auto-displaying update routines need to display.
99 
100   // SIGWINCH handling
101   void sigwinch_mask(int how);
102   void setupsigwinch();
103 
104   static baselist *signallist;
105   static void sigwinchhandler(int);
106 
107   int nitems, ldrawnstart, ldrawnend, showinfo;
108   int topofscreen, leftofscreen, cursorline;
109   int infotopofscreen, infolines;
110   varbuf whatinfovb;
111   char searchstring[128];
112 
113   virtual void setheights();
114   void unsizes();
115   void dosearch();
116   void displayhelp(const struct helpmenuentry *menu, int key);
117   void displayerror(const char *str);
118 
119   void redrawall();
120   void redrawitemsrange(int start /*inclusive*/, int end /*exclusive*/);
121   void redraw1item(int index);
122   void refreshlist();
123   void refreshinfo();
124   void refreshcolheads();
125   void setcursor(int index);
126 
127   void itd_keys();
128 
129   virtual void redraw1itemsel(int index, int selected) =0;
130   virtual void redrawcolheads() =0;
131   virtual void redrawthisstate() =0;
132   virtual void redrawinfo() =0;
133   virtual void redrawtitle() =0;
134   virtual void setwidths() =0;
135   virtual const char *itemname(int index) =0;
136   virtual const struct helpmenuentry *helpmenulist() =0;
137 
138   virtual bool checksearch(char *str);
139   virtual bool matchsearch(int index);
140   void wordwrapinfo(int offset, const char *string);
141 
142 public:
143 
144   keybindings *bindings;
145 
146   void kd_up();
147   void kd_down();
148   void kd_redraw();
149   void kd_scrollon();
150   void kd_scrollback();
151   void kd_scrollon1();
152   void kd_scrollback1();
153   void kd_panon();
154   void kd_panback();
155   void kd_panon1();
156   void kd_panback1();
157   void kd_top();
158   void kd_bottom();
159   void kd_iscrollon();
160   void kd_iscrollback();
161   void kd_iscrollon1();
162   void kd_iscrollback1();
163   void kd_search();
164   void kd_searchagain();
165   void kd_help();
166 
167   void startdisplay();
168   void enddisplay();
169 
170   baselist(keybindings *);
171   virtual ~baselist();
172 };
173 
174 void displayhelp(const struct helpmenuentry *menu, int key);
175 
176 void mywerase(WINDOW *win);
177 
178 void curseson();
179 void cursesoff();
180 
181 extern bool expertmode;
182 
183 struct colordata {
184        int fore;
185        int back;
186        int attr;
187 };
188 extern colordata color[];
189 
190 /* Evil recommends flag variable. */
191 extern bool manual_install;
192 
193 enum urqresult { urqr_normal, urqr_fail, urqr_quitmenu };
194 enum quitaction { qa_noquit, qa_quitchecksave, qa_quitnochecksave };
195 
196 typedef urqresult urqfunction(void);
197 urqfunction urq_list, urq_quit, urq_menu;
198 urqfunction urq_setup, urq_update, urq_install, urq_config, urq_remove;
199 
200 #endif /* DSELECT_H */
201