Remove the fixed screen size assumptions.
Dynamically allocate the text and menu arrays instead. Change-Id: Idbfc3fe4e4b50db4fee62ac2b6a7323cad369749
This commit is contained in:
parent
ca7bf53189
commit
aa0d6afb61
2 changed files with 37 additions and 32 deletions
|
@ -40,25 +40,26 @@ static int char_height;
|
||||||
// There's only (at most) one of these objects, and global callbacks
|
// There's only (at most) one of these objects, and global callbacks
|
||||||
// (for pthread_create, and the input event system) need to find it,
|
// (for pthread_create, and the input event system) need to find it,
|
||||||
// so use a global variable.
|
// so use a global variable.
|
||||||
static ScreenRecoveryUI* self = NULL;
|
static ScreenRecoveryUI* self = nullptr;
|
||||||
|
|
||||||
// Return the current time as a double (including fractions of a second).
|
// Return the current time as a double (including fractions of a second).
|
||||||
static double now() {
|
static double now() {
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, nullptr);
|
||||||
return tv.tv_sec + tv.tv_usec / 1000000.0;
|
return tv.tv_sec + tv.tv_usec / 1000000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScreenRecoveryUI::ScreenRecoveryUI() :
|
ScreenRecoveryUI::ScreenRecoveryUI() :
|
||||||
currentIcon(NONE),
|
currentIcon(NONE),
|
||||||
installingFrame(0),
|
installingFrame(0),
|
||||||
locale(NULL),
|
locale(nullptr),
|
||||||
rtl_locale(false),
|
rtl_locale(false),
|
||||||
progressBarType(EMPTY),
|
progressBarType(EMPTY),
|
||||||
progressScopeStart(0),
|
progressScopeStart(0),
|
||||||
progressScopeSize(0),
|
progressScopeSize(0),
|
||||||
progress(0),
|
progress(0),
|
||||||
pagesIdentical(false),
|
pagesIdentical(false),
|
||||||
|
text(nullptr),
|
||||||
text_cols(0),
|
text_cols(0),
|
||||||
text_rows(0),
|
text_rows(0),
|
||||||
text_col(0),
|
text_col(0),
|
||||||
|
@ -66,6 +67,7 @@ ScreenRecoveryUI::ScreenRecoveryUI() :
|
||||||
text_top(0),
|
text_top(0),
|
||||||
show_text(false),
|
show_text(false),
|
||||||
show_text_ever(false),
|
show_text_ever(false),
|
||||||
|
menu(nullptr),
|
||||||
show_menu(false),
|
show_menu(false),
|
||||||
menu_top(0),
|
menu_top(0),
|
||||||
menu_items(0),
|
menu_items(0),
|
||||||
|
@ -75,12 +77,10 @@ ScreenRecoveryUI::ScreenRecoveryUI() :
|
||||||
stage(-1),
|
stage(-1),
|
||||||
max_stage(-1) {
|
max_stage(-1) {
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++) {
|
||||||
backgroundIcon[i] = NULL;
|
backgroundIcon[i] = nullptr;
|
||||||
|
}
|
||||||
memset(text, 0, sizeof(text));
|
pthread_mutex_init(&updateMutex, nullptr);
|
||||||
|
|
||||||
pthread_mutex_init(&updateMutex, NULL);
|
|
||||||
self = this;
|
self = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,7 +247,8 @@ void ScreenRecoveryUI::draw_screen_locked()
|
||||||
// screen, the bottom of the menu, or we've displayed the
|
// screen, the bottom of the menu, or we've displayed the
|
||||||
// entire text buffer.
|
// entire text buffer.
|
||||||
int row = (text_top+text_rows-1) % text_rows;
|
int row = (text_top+text_rows-1) % text_rows;
|
||||||
for (int ty = gr_fb_height() - char_height, count = 0;
|
size_t count = 0;
|
||||||
|
for (int ty = gr_fb_height() - char_height;
|
||||||
ty > y+2 && count < text_rows;
|
ty > y+2 && count < text_rows;
|
||||||
ty -= char_height, ++count) {
|
ty -= char_height, ++count) {
|
||||||
gr_text(0, ty, text[row], 0);
|
gr_text(0, ty, text[row], 0);
|
||||||
|
@ -281,7 +282,7 @@ void ScreenRecoveryUI::update_progress_locked()
|
||||||
// Keeps the progress bar updated, even when the process is otherwise busy.
|
// Keeps the progress bar updated, even when the process is otherwise busy.
|
||||||
void* ScreenRecoveryUI::progress_thread(void *cookie) {
|
void* ScreenRecoveryUI::progress_thread(void *cookie) {
|
||||||
self->progress_loop();
|
self->progress_loop();
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenRecoveryUI::progress_loop() {
|
void ScreenRecoveryUI::progress_loop() {
|
||||||
|
@ -344,23 +345,32 @@ void ScreenRecoveryUI::LoadLocalizedBitmap(const char* filename, gr_surface* sur
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char** Alloc2d(size_t rows, size_t cols) {
|
||||||
|
char** result = new char*[rows];
|
||||||
|
for (size_t i = 0; i < rows; ++i) {
|
||||||
|
result[i] = new char[cols];
|
||||||
|
memset(result[i], 0, cols);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void ScreenRecoveryUI::Init()
|
void ScreenRecoveryUI::Init()
|
||||||
{
|
{
|
||||||
gr_init();
|
gr_init();
|
||||||
|
|
||||||
gr_font_size(&char_width, &char_height);
|
gr_font_size(&char_width, &char_height);
|
||||||
|
text_rows = gr_fb_height() / char_height;
|
||||||
|
text_cols = gr_fb_width() / char_width;
|
||||||
|
|
||||||
|
text = Alloc2d(text_rows, text_cols + 1);
|
||||||
|
menu = Alloc2d(text_rows, text_cols + 1);
|
||||||
|
|
||||||
text_col = text_row = 0;
|
text_col = text_row = 0;
|
||||||
text_rows = gr_fb_height() / char_height;
|
|
||||||
if (text_rows > kMaxRows) text_rows = kMaxRows;
|
|
||||||
text_top = 1;
|
text_top = 1;
|
||||||
|
|
||||||
text_cols = gr_fb_width() / char_width;
|
backgroundIcon[NONE] = nullptr;
|
||||||
if (text_cols > kMaxCols - 1) text_cols = kMaxCols - 1;
|
|
||||||
|
|
||||||
backgroundIcon[NONE] = NULL;
|
|
||||||
LoadBitmapArray("icon_installing", &installing_frames, &installation);
|
LoadBitmapArray("icon_installing", &installing_frames, &installation);
|
||||||
backgroundIcon[INSTALLING_UPDATE] = installing_frames ? installation[0] : NULL;
|
backgroundIcon[INSTALLING_UPDATE] = installing_frames ? installation[0] : nullptr;
|
||||||
backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE];
|
backgroundIcon[ERASING] = backgroundIcon[INSTALLING_UPDATE];
|
||||||
LoadBitmap("icon_error", &backgroundIcon[ERROR]);
|
LoadBitmap("icon_error", &backgroundIcon[ERROR]);
|
||||||
backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR];
|
backgroundIcon[NO_COMMAND] = backgroundIcon[ERROR];
|
||||||
|
@ -375,7 +385,7 @@ void ScreenRecoveryUI::Init()
|
||||||
LoadLocalizedBitmap("no_command_text", &backgroundText[NO_COMMAND]);
|
LoadLocalizedBitmap("no_command_text", &backgroundText[NO_COMMAND]);
|
||||||
LoadLocalizedBitmap("error_text", &backgroundText[ERROR]);
|
LoadLocalizedBitmap("error_text", &backgroundText[ERROR]);
|
||||||
|
|
||||||
pthread_create(&progress_t, NULL, progress_thread, NULL);
|
pthread_create(&progress_t, nullptr, progress_thread, nullptr);
|
||||||
|
|
||||||
RecoveryUI::Init();
|
RecoveryUI::Init();
|
||||||
}
|
}
|
||||||
|
@ -402,7 +412,7 @@ void ScreenRecoveryUI::SetLocale(const char* new_locale) {
|
||||||
}
|
}
|
||||||
free(lang);
|
free(lang);
|
||||||
} else {
|
} else {
|
||||||
new_locale = NULL;
|
new_locale = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,17 +506,17 @@ void ScreenRecoveryUI::Print(const char *fmt, ...)
|
||||||
|
|
||||||
void ScreenRecoveryUI::StartMenu(const char* const * headers, const char* const * items,
|
void ScreenRecoveryUI::StartMenu(const char* const * headers, const char* const * items,
|
||||||
int initial_selection) {
|
int initial_selection) {
|
||||||
int i;
|
|
||||||
pthread_mutex_lock(&updateMutex);
|
pthread_mutex_lock(&updateMutex);
|
||||||
if (text_rows > 0 && text_cols > 0) {
|
if (text_rows > 0 && text_cols > 0) {
|
||||||
|
size_t i;
|
||||||
for (i = 0; i < text_rows; ++i) {
|
for (i = 0; i < text_rows; ++i) {
|
||||||
if (headers[i] == NULL) break;
|
if (headers[i] == nullptr) break;
|
||||||
strncpy(menu[i], headers[i], text_cols-1);
|
strncpy(menu[i], headers[i], text_cols-1);
|
||||||
menu[i][text_cols-1] = '\0';
|
menu[i][text_cols-1] = '\0';
|
||||||
}
|
}
|
||||||
menu_top = i;
|
menu_top = i;
|
||||||
for (; i < text_rows; ++i) {
|
for (; i < text_rows; ++i) {
|
||||||
if (items[i-menu_top] == NULL) break;
|
if (items[i-menu_top] == nullptr) break;
|
||||||
strncpy(menu[i], items[i-menu_top], text_cols-1);
|
strncpy(menu[i], items[i-menu_top], text_cols-1);
|
||||||
menu[i][text_cols-1] = '\0';
|
menu[i][text_cols-1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
13
screen_ui.h
13
screen_ui.h
|
@ -84,17 +84,14 @@ class ScreenRecoveryUI : public RecoveryUI {
|
||||||
// progress bar)
|
// progress bar)
|
||||||
bool pagesIdentical;
|
bool pagesIdentical;
|
||||||
|
|
||||||
static const int kMaxCols = 96;
|
|
||||||
static const int kMaxRows = 96;
|
|
||||||
|
|
||||||
// Log text overlay, displayed when a magic key is pressed
|
// Log text overlay, displayed when a magic key is pressed
|
||||||
char text[kMaxRows][kMaxCols];
|
char** text;
|
||||||
int text_cols, text_rows;
|
size_t text_cols, text_rows;
|
||||||
int text_col, text_row, text_top;
|
size_t text_col, text_row, text_top;
|
||||||
bool show_text;
|
bool show_text;
|
||||||
bool show_text_ever; // has show_text ever been true?
|
bool show_text_ever; // has show_text ever been true?
|
||||||
|
|
||||||
char menu[kMaxRows][kMaxCols];
|
char** menu;
|
||||||
bool show_menu;
|
bool show_menu;
|
||||||
int menu_top, menu_items, menu_sel;
|
int menu_top, menu_items, menu_sel;
|
||||||
|
|
||||||
|
@ -102,8 +99,6 @@ class ScreenRecoveryUI : public RecoveryUI {
|
||||||
|
|
||||||
int animation_fps;
|
int animation_fps;
|
||||||
int installing_frames;
|
int installing_frames;
|
||||||
protected:
|
|
||||||
private:
|
|
||||||
|
|
||||||
int iconX, iconY;
|
int iconX, iconY;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue