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