#include #include #include #include #include #include #define BORDER_SIZE 2 //includes border #define PADDING 8 #define FONT "berry" #define BORDER_COLOR 0x10 #define BG_COLOR 0x07 #define FG_COlOR 0x10 static const struct font_info *info_font = 0; static const struct key_packet info_quits[] = { { .key_id = KEY_ESCAPE, .modifiers = NO_MODS }, { .key_id = 0 } }; void info_popup(struct popup *into, const char *msg, uint8_t fg, uint8_t bg) { if (!info_font) info_font = get_font(FONT); uint32_t w = 0, h = 1, lw = 0; for (const char *i = msg; *i; ++i) if (*i == '\n') { ++h; if (lw > w) w = lw; lw = 0; } else ++lw; if (lw > w) w = lw; into->has_quit = false; into->quit_binds = (struct key_packet *)info_quits; const uint32_t pitch = info_font->space_width * w + 2 * PADDING; const uint32_t height = info_font->space_height * h + 2 * PADDING; uint8_t *const pixbuf = get_block(pitch * height); for (uint32_t i = 0; i < pitch * BORDER_SIZE; ++i) pixbuf[i] = BORDER_COLOR; for (uint32_t y = BORDER_SIZE; y < height - BORDER_SIZE; ++y) { for (uint32_t x = 0; x < BORDER_SIZE; ++x) pixbuf[y * pitch + x] = BORDER_COLOR; for (uint32_t x = pitch - BORDER_SIZE; x < pitch; ++x) pixbuf[y * pitch + x] = BORDER_COLOR; } for (uint32_t i = 0; i < pitch * BORDER_SIZE; ++i) pixbuf[(height - BORDER_SIZE) * pitch + i] = BORDER_COLOR; for (uint32_t y = BORDER_SIZE; y < height - BORDER_SIZE; ++y) for (uint32_t x = BORDER_SIZE; x < pitch - BORDER_SIZE; ++x) pixbuf[y * pitch + x] = BG_COLOR; uint32_t my = 0; uint32_t mx = 0; --msg; while (*++msg) { if (*msg == '\n') { ++my; mx = 0; } else { //syslogf("calling put_char(0x%x, '%c', pixbuf + %u, %u, 0x%2x, 0x%2x)", info_font, *msg, // (my * info_font->space_height + PADDING) * pitch + mx * info_font->space_width + PADDING, // pitch, BG_COLOR, FG_COlOR); put_char(info_font, *msg, pixbuf + (my * info_font->space_height + PADDING) * pitch + mx++ * info_font->space_width + PADDING, pitch, BG_COLOR, FG_COlOR); } } into->pixbuf = pixbuf; into->handle = _new_window(pitch, height, pixbuf); } void info_popupf_v(struct popup *into, const char *text, uint8_t fg, uint8_t bg, va_list args) { char *const msg = format_v(text, args); info_popup(into, msg, fg, bg); free_block(msg); } void info_popupf(struct popup *into, const char *text, uint8_t fg, uint8_t bg, ...) { va_list args; va_start(args, bg); info_popupf_v(into, text, fg, bg, args); va_end(args); }