int uimon_out(const char *buffer) { if (menu_draw) { int y = menu_draw->max_text_y - 1; char *p = (char *)buffer; int i = 0; char c; while ((c = p[i]) != 0) { if (c == '\n') { p[i] = 0; sdl_ui_print(p, x_pos, y); sdl_ui_scroll_screen_up(); x_pos = 0; p += i + 1; i = 0; } else { ++i; } } if (p[0] != 0) { x_pos += sdl_ui_print(p, x_pos, y); } } return 0; }
static void sdl_ui_image_file_selector_redraw_cursor(image_contents_t *contents, int offset, int num_items, ui_menu_filereq_mode_t mode, int cur_offset, int old_offset) { int i, j; char* name; uint8_t oldbg = 0; image_contents_file_list_t *entry; entry = contents->file_list; for (i = 0; i < offset; ++i) { entry = entry->next; } for (i = 0; i < num_items; ++i) { if ((i == cur_offset) || (i == old_offset)){ if (i == cur_offset) { oldbg = sdl_ui_set_cursor_colors(); } j = MENU_FIRST_X; name = image_contents_file_to_string(entry, IMAGE_CONTENTS_STRING_PETSCII); j += sdl_ui_print(name, j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM); sdl_ui_print_eol(j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM); if (i == cur_offset) { sdl_ui_reset_cursor_colors(oldbg); } } entry = entry->next; } }
void sdl_vsid_draw(void) { int i; for (i = 0; i < (int)VSID_S_NUM; ++i) { sdl_ui_print(vsidstrings[i], 0, i); } }
static void sdl_poll_print_timeout(int x, int y, int time) { char *timestr = NULL; timestr = lib_msprintf("Timeout in %i...", time); sdl_ui_print(timestr, x, y); sdl_ui_refresh(); lib_free(timestr); }
static void sdl_ui_image_file_selector_redraw(image_contents_t *contents, const char *title, int offset, int num_items, int more, ui_menu_filereq_mode_t mode, int cur_offset) { int i, j; char* title_string; char* name; uint8_t oldbg; image_contents_file_list_t *entry; title_string = image_contents_to_string(contents, 0); sdl_ui_clear(); sdl_ui_display_title(title_string); lib_free(title_string); entry = contents->file_list; for (i = 0; i < offset; ++i) { entry = entry->next; } for (i = 0; i < num_items; ++i) { if (i == cur_offset) { oldbg = sdl_ui_set_cursor_colors(); } j = MENU_FIRST_X; name = image_contents_file_to_string(entry, IMAGE_CONTENTS_STRING_PETSCII); j += sdl_ui_print(name, j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM); if (i == cur_offset) { sdl_ui_print_eol(j, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM); sdl_ui_reset_cursor_colors(oldbg); } entry = entry->next; } name = lib_msprintf("%d BLOCKS FREE.", contents->blocks_free); sdl_ui_print(name, MENU_FIRST_X, i + IMAGE_FIRST_Y + SDL_FILEREQ_META_NUM); lib_free(name); }
char *uimon_get_in(char **ppchCommandLine, const char *prompt) { int y, x_off; char *input; y = menu_draw->max_text_y - 1; x_pos = 0; x_off = sdl_ui_print(prompt, 0, y); input = sdl_ui_readline(NULL, x_off, y); sdl_ui_scroll_screen_up(); if (input == NULL) { input = lib_stralloc("x"); } return input; }
static void show_text(const char *text) { int first_line = 0; int next_line = 0; int next_page = 0; unsigned int current_line = 0; unsigned int len; int x, y, z; int active = 1; int active_keys; char *string; menu_draw_t *menu_draw; menu_draw = sdl_ui_get_menu_param(); string = lib_malloc(128); len = strlen(text); while (active) { sdl_ui_clear(); first_line = current_line; for (y = 0; (y < menu_draw->max_text_y) && (current_line < len); y++) { z = 0; for (x = 0; text[current_line + x] != '\n'; x++) { switch (text[current_line + x]) { case '`': string[x + z] = '\''; break; case 'ä': string[x + z] = 'a'; break; case '~': string[x + z] = '-'; break; case 'é': case 'è': string[x + z] = 'e'; break; case 'Ö': string[x + z] = 'O'; break; case 'ö': string[x + z] = 'o'; break; case 'å': string[x + z] = 'a'; break; case '\t': string[x + z] = ' '; string[x + z + 1] = ' '; string[x + z + 2] = ' '; string[x + z + 3] = ' '; z += 3; break; default: string[x + z] = text[current_line + x]; break; } } if (x != 0) { string[x + z] = 0; sdl_ui_print(string, 0, y); } if (y == 0) { next_line = current_line + x + 1; } current_line += x + 1; } next_page = current_line; active_keys = 1; sdl_ui_refresh(); while (active_keys) { switch(sdl_ui_menu_poll_input()) { case MENU_ACTION_CANCEL: case MENU_ACTION_EXIT: case MENU_ACTION_SELECT: active_keys = 0; active = 0; break; case MENU_ACTION_RIGHT: active_keys = 0; current_line = next_page; break; case MENU_ACTION_DOWN: active_keys = 0; current_line = next_line; break; case MENU_ACTION_LEFT: active_keys = 0; current_line = scroll_up(text, first_line, menu_draw->max_text_y); break; case MENU_ACTION_UP: active_keys = 0; current_line = scroll_up(text, first_line, 1); break; default: SDL_Delay(10); break; } } } lib_free(string); }
static void show_text(const char *text) { int first_line = 0; int last_line = 0; int next_line = 0; int next_page = 0; unsigned int current_line = 0; unsigned int this_line = 0; unsigned int len; int x, y, z; int active = 1; int active_keys; char *string; menu_draw_t *menu_draw; menu_draw = sdl_ui_get_menu_param(); string = lib_malloc(0x400); len = strlen(text); /* find out how many lines */ for (x = 0, z = 0; text[x] != 0; x++) { if (text[x] == '\n') { last_line++; } } last_line -= menu_draw->max_text_y; for (x = 0, z = 0; text[x] != 0; x++) { if (last_line == 0) { break; } if (text[x] == '\n') { last_line--; } } last_line = x; /* save the offset */ while (active) { sdl_ui_clear(); first_line = current_line; this_line = current_line; for (y = 0; (y < menu_draw->max_text_y) && (this_line < len); y++) { z = 0; for (x = 0; (text[this_line + x] != '\n') && (text[this_line + x] != 0); x++) { switch (text[this_line + x]) { case '`': string[x + z] = '\''; break; /* FIXME: we should actually be able to handle some of these */ case CHARCODE_UMLAUT_A_LOWER: case CHARCODE_KROUZEK_A_LOWER: string[x + z] = 'a'; break; case CHARCODE_UMLAUT_A_UPPER: string[x + z] = 'A'; break; case '~': string[x + z] = '-'; break; case CHARCODE_GRAVE_E_LOWER: case CHARCODE_AIGU_E_LOWER: string[x + z] = 'e'; break; case CHARCODE_UMLAUT_O_UPPER: string[x + z] = 'O'; break; case CHARCODE_UMLAUT_O_LOWER: string[x + z] = 'o'; break; case CHARCODE_UMLAUT_U_UPPER: string[x + z] = 'U'; break; case CHARCODE_UMLAUT_U_LOWER: string[x + z] = 'u'; break; case '\t': string[x + z] = ' '; string[x + z + 1] = ' '; string[x + z + 2] = ' '; string[x + z + 3] = ' '; z += 3; break; default: string[x + z] = text[this_line + x]; break; } } if (x != 0) { string[x + z] = 0; sdl_ui_print(string, 0, y); } if (y == 0) { next_line = this_line + x + 1; } this_line += x + 1; } next_page = this_line; active_keys = 1; sdl_ui_refresh(); while (active_keys) { switch (sdl_ui_menu_poll_input()) { case MENU_ACTION_CANCEL: case MENU_ACTION_EXIT: case MENU_ACTION_SELECT: active_keys = 0; active = 0; break; case MENU_ACTION_RIGHT: case MENU_ACTION_PAGEDOWN: active_keys = 0; if (current_line < last_line) { current_line = next_page; if (current_line > last_line) { current_line = last_line; } } break; case MENU_ACTION_DOWN: active_keys = 0; if (current_line < last_line) { current_line = next_line; if (current_line > last_line) { current_line = last_line; } } break; case MENU_ACTION_LEFT: case MENU_ACTION_PAGEUP: active_keys = 0; current_line = scroll_up(text, first_line, menu_draw->max_text_y); break; case MENU_ACTION_UP: active_keys = 0; current_line = scroll_up(text, first_line, 1); break; case MENU_ACTION_HOME: active_keys = 0; current_line = 0; break; case MENU_ACTION_END: active_keys = 0; if (current_line < last_line) { current_line = last_line; } break; default: SDL_Delay(10); break; } } } lib_free(string); }
SDL_Event sdl_ui_poll_event(const char *what, const char *target, int options, int timeout) { SDL_Event e; int count = 0; int polling = 1; int i; int allow_keyboard = options & SDL_POLL_KEYBOARD; int allow_modifier = options & SDL_POLL_MODIFIER; #ifdef HAVE_SDL_NUMJOYSTICKS int allow_joystick = options & SDL_POLL_JOYSTICK; #endif sdl_ui_clear(); i = sdl_ui_print("Polling ", 0, 0); i = i + sdl_ui_print(what, i, 0); sdl_ui_print(" for:", i, 0); sdl_ui_print(target, 0, 1); if (timeout > 0) { sdl_poll_print_timeout(0, 2, timeout); } /* TODO check if key/event is suitable */ while (polling) { while (polling && SDL_PollEvent(&e)) { switch (e.type) { case SDL_KEYDOWN: if (allow_keyboard && (allow_modifier || is_not_modifier(e.key.keysym.sym))) { polling = 0; } break; #ifdef HAVE_SDL_NUMJOYSTICKS case SDL_JOYBUTTONDOWN: if (allow_joystick) { polling = 0; } break; case SDL_JOYHATMOTION: if (allow_joystick && (sdljoy_check_hat_movement(e) != 0)) { polling = 0; } break; case SDL_JOYAXISMOTION: if (allow_joystick && (sdljoy_check_axis_movement(e) != 0)) { polling = 0; } break; #endif default: ui_handle_misc_sdl_event(e); break; } } SDL_Delay(20); if ((timeout > 0) && (++count == 1000 / 20)) { count = 0; if (--timeout == 0) { e.type = SDL_USEREVENT; polling = 0; } else { sdl_poll_print_timeout(0, 2, timeout); } } } if (polling == 1) { e.type = SDL_USEREVENT; } return e; }