1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
3 #include "cmCursesLongMessageForm.h"
8 #include "cmCursesForm.h"
9 #include "cmCursesMainForm.h"
10 #include "cmCursesStandardIncludes.h"
11 #include "cmStringAlgorithms.h"
12 #include "cmVersion.h"
14 inline int ctrl(int z)
19 cmCursesLongMessageForm::cmCursesLongMessageForm(
20 std::vector<std::string> const& messages, const char* title,
21 ScrollBehavior scrollBehavior)
22 : Scrolling(scrollBehavior)
24 // Append all messages into on big string
25 this->Messages = cmJoin(messages, "\n");
27 this->Fields[0] = nullptr;
28 this->Fields[1] = nullptr;
31 cmCursesLongMessageForm::~cmCursesLongMessageForm()
33 if (this->Fields[0]) {
34 free_field(this->Fields[0]);
38 void cmCursesLongMessageForm::UpdateStatusBar()
42 getmaxyx(stdscr, y, x);
44 char bar[cmCursesMainForm::MAX_WIDTH];
45 size_t size = this->Title.size();
46 if (size >= cmCursesMainForm::MAX_WIDTH) {
47 size = cmCursesMainForm::MAX_WIDTH - 1;
49 strncpy(bar, this->Title.c_str(), size);
50 for (size_t i = size; i < cmCursesMainForm::MAX_WIDTH; i++) {
54 if (x < cmCursesMainForm::MAX_WIDTH) {
57 width = cmCursesMainForm::MAX_WIDTH - 1;
62 char version[cmCursesMainForm::MAX_WIDTH];
64 sprintf(vertmp, "CMake Version %s", cmVersion::GetCMakeVersion());
65 size_t sideSpace = (width - strlen(vertmp));
66 for (size_t i = 0; i < sideSpace; i++) {
69 sprintf(version + sideSpace, "%s", vertmp);
70 version[width] = '\0';
73 curses_move(y - 4, 0);
77 curses_move(y - 3, 0);
78 printw(fmt_s, version);
79 pos_form_cursor(this->Form);
82 void cmCursesLongMessageForm::PrintKeys()
86 getmaxyx(stdscr, y, x);
87 if (x < cmCursesMainForm::MIN_WIDTH || y < cmCursesMainForm::MIN_HEIGHT) {
91 sprintf(firstLine, "Press [e] to exit screen");
94 curses_move(y - 2, 0);
95 printw(fmt_s, firstLine);
96 pos_form_cursor(this->Form);
99 void cmCursesLongMessageForm::Render(int /*left*/, int /*top*/, int /*width*/,
104 getmaxyx(stdscr, y, x);
107 unpost_form(this->Form);
108 free_form(this->Form);
109 this->Form = nullptr;
112 const char* msg = this->Messages.c_str();
114 if (this->Fields[0]) {
115 free_field(this->Fields[0]);
116 this->Fields[0] = nullptr;
119 this->Fields[0] = new_field(y - 6, x - 2, 1, 1, 0, 0);
121 field_opts_off(this->Fields[0], O_STATIC);
123 this->Form = new_form(this->Fields);
124 post_form(this->Form);
127 form_driver(this->Form, REQ_BEG_FIELD);
128 while (msg[i] != '\0' && i < 60000) {
129 if (msg[i] == '\n' && msg[i + 1] != '\0') {
130 form_driver(this->Form, REQ_NEW_LINE);
132 form_driver(this->Form, msg[i]);
136 if (this->Scrolling == ScrollBehavior::ScrollDown) {
137 form_driver(this->Form, REQ_END_FIELD);
139 form_driver(this->Form, REQ_BEG_FIELD);
142 this->UpdateStatusBar();
147 void cmCursesLongMessageForm::HandleInput()
153 char debugMessage[128];
159 sprintf(debugMessage, "Message widget handling input, key: %d", key);
160 cmCursesForm::LogMessage(debugMessage);
163 if (key == 'o' || key == 'e') {
166 if (key == KEY_DOWN || key == ctrl('n')) {
167 form_driver(this->Form, REQ_SCR_FLINE);
168 } else if (key == KEY_UP || key == ctrl('p')) {
169 form_driver(this->Form, REQ_SCR_BLINE);
170 } else if (key == KEY_NPAGE || key == ctrl('d')) {
171 form_driver(this->Form, REQ_SCR_FPAGE);
172 } else if (key == KEY_PPAGE || key == ctrl('u')) {
173 form_driver(this->Form, REQ_SCR_BPAGE);
176 this->UpdateStatusBar();