static void glui_navigation_set(bool scroll) { menu_display_t *disp = menu_display_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); float scroll_pos = 0; if (!menu || !disp || !scroll) return; scroll_pos = glui_get_scroll(); if (menu->userdata) { unsigned height = 0, num_lines = 0, end = 0; glui_handle_t *glui = (glui_handle_t*)menu->userdata; menu_navigation_t *nav = menu_navigation_get_ptr(); video_driver_get_size(NULL, &height); num_lines = height / glui->line_height; end = menu_entries_get_end(); if (nav->selection_ptr < num_lines / 2 || end <= num_lines) menu_entries_set_start(0); else if (nav->selection_ptr < (end - num_lines / 2)) menu_entries_set_start(nav->selection_ptr - num_lines / 2); else menu_entries_set_start(end - num_lines); if (menu_entries_get_start() >= 5) menu_entries_set_start(menu_entries_get_start() - 5); } menu_animation_push(disp->animation, 10, scroll_pos, &menu->scroll_y, EASING_IN_OUT_QUAD, -1, NULL); }
static void glui_draw_scrollbar(gl_t *gl, unsigned width, unsigned height, GRfloat *coord_color) { float content_height, total_height, scrollbar_height, y; int scrollbar_width = 4; glui_handle_t *glui = NULL; menu_handle_t *menu = menu_driver_get_ptr(); menu_display_t *disp = menu_display_get_ptr(); if (!menu) return; glui = (glui_handle_t*)menu->userdata; content_height = menu_entries_get_end() * glui->line_height; total_height = height - disp->header_height * 2; scrollbar_height = total_height / (content_height / total_height); y = total_height * menu->scroll_y / content_height; if (content_height >= total_height) glui_render_quad(gl, width - scrollbar_width, disp->header_height + y, scrollbar_width, scrollbar_height, width, height, coord_color); }
static void glui_draw_scrollbar(gl_t *gl) { unsigned width, height; float content_height, total_height, scrollbar_height, y; int scrollbar_width = 4; glui_handle_t *glui = NULL; menu_handle_t *menu = menu_driver_get_ptr(); menu_display_t *disp = menu_display_get_ptr(); if (!menu) return; video_driver_get_size(&width, &height); glui = (glui_handle_t*)menu->userdata; content_height = menu_entries_get_end() * glui->line_height; total_height = height - disp->header_height * 2; scrollbar_height = total_height / (content_height / total_height); y = total_height * menu->scroll_y / content_height; if (content_height < total_height) return; glui_render_quad(gl, width - scrollbar_width, disp->header_height + y, scrollbar_width, scrollbar_height, 1, 1, 1, 1); }
static void glui_render_menu_list(glui_handle_t *glui, menu_handle_t *menu, uint32_t normal_color, uint32_t hover_color) { unsigned width, height; size_t i = 0; uint64_t frame_count = video_driver_get_frame_count(); size_t end = menu_entries_get_end(); menu_display_t *disp = menu_display_get_ptr(); if (!menu_display_update_pending()) return; video_driver_get_size(&width, &height); glui->list_block.carr.coords.vertices = 0; for (i = menu_entries_get_start(); i < end; i++) { bool entry_selected; char entry_path[PATH_MAX_LENGTH]; char entry_value[PATH_MAX_LENGTH]; char message[PATH_MAX_LENGTH]; char entry_title_buf[PATH_MAX_LENGTH]; char type_str_buf[PATH_MAX_LENGTH]; int y = disp->header_height - menu->scroll_y + (glui->line_height * i); if (y > (int)height || ((y + (int)glui->line_height) < 0)) continue; entry_path[0] = '\0'; entry_value[0] = '\0'; message[0] = '\0'; entry_title_buf[0] = '\0'; type_str_buf[0] = '\0'; entry_selected = menu_entry_is_currently_selected(i); menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); menu_animation_ticker_line(entry_title_buf, glui->ticker_limit, frame_count / 100, entry_path, entry_selected); menu_animation_ticker_line(type_str_buf, glui->ticker_limit, frame_count / 100, entry_value, entry_selected); strlcpy(message, entry_title_buf, sizeof(message)); glui_blit_line(glui->margin, y, message, entry_selected ? hover_color : normal_color, TEXT_ALIGN_LEFT); glui_blit_line(width - glui->margin, y, type_str_buf, entry_selected ? hover_color : normal_color, TEXT_ALIGN_RIGHT); } }
static void mui_render_menu_list(mui_handle_t *mui, unsigned width, unsigned height, uint32_t normal_color, uint32_t hover_color, float *pure_white) { unsigned header_height; uint64_t *frame_count; size_t i = 0; size_t end = menu_entries_get_end(); video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); if (!menu_display_ctl(MENU_DISPLAY_CTL_UPDATE_PENDING, NULL)) return; menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); mui->list_block.carr.coords.vertices = 0; menu_entries_ctl(MENU_ENTRIES_CTL_START_GET, &i); for (; i < end; i++) { int y; size_t selection; bool entry_selected; menu_entry_t entry; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) continue; y = header_height - mui->scroll_y + (mui->line_height * i); if ((y - (int)mui->line_height) > (int)height || ((y + (int)mui->line_height) < 0)) continue; menu_entry_get(&entry, 0, i, NULL, true); entry_selected = selection == i; mui_render_label_value(mui, y, width, height, *frame_count / 20, entry_selected ? hover_color : normal_color, entry_selected, entry.path, entry.value, pure_white); } }
static void glui_render_menu_list(glui_handle_t *glui, unsigned width, unsigned height, menu_handle_t *menu, uint32_t normal_color, uint32_t hover_color) { unsigned header_height; size_t i = 0; uint64_t *frame_count = video_driver_get_frame_count(); size_t end = menu_entries_get_end(); if (!menu_display_ctl(MENU_DISPLAY_CTL_UPDATE_PENDING, NULL)) return; menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); glui->list_block.carr.coords.vertices = 0; for (i = menu_entries_get_start(); i < end; i++) { int y; size_t selection; bool entry_selected; menu_entry_t entry; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) continue; y = header_height - menu->scroll_y + (glui->line_height * i); if (y > (int)height || ((y + (int)glui->line_height) < 0)) continue; menu_entries_get(i, &entry); entry_selected = selection == i; glui_render_label_value(glui, y, width, height, *frame_count / 40, entry_selected ? hover_color : normal_color, entry_selected, entry.path, entry.value); } }
static void glui_render_menu_list(glui_handle_t *glui, menu_handle_t *menu, uint32_t normal_color, uint32_t hover_color) { unsigned width, height; size_t i = 0; uint64_t *frame_count = video_driver_get_frame_count(); size_t end = menu_entries_get_end(); menu_display_t *disp = menu_display_get_ptr(); menu_entries_t *entries = menu_entries_get_ptr(); if (!menu_display_update_pending()) return; video_driver_get_size(&width, &height); glui->list_block.carr.coords.vertices = 0; for (i = menu_entries_get_start(); i < end; i++) { bool entry_selected; menu_entry_t entry; int y = disp->header_height - menu->scroll_y + (glui->line_height * i); if (y > (int)height || ((y + (int)glui->line_height) < 0)) continue; menu_entries_get(i, &entry); entry_selected = entries->navigation.selection_ptr == i; glui_render_label_value(glui, y, width, *frame_count / 40, entry_selected ? hover_color : normal_color, entry_selected, entry.path, entry.value); } }
static void mui_draw_scrollbar(mui_handle_t *mui, unsigned width, unsigned height, float *coord_color) { unsigned header_height; float content_height, total_height, scrollbar_height, scrollbar_margin, y; if (!mui) return; menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); content_height = menu_entries_get_end() * mui->line_height; total_height = height - header_height - mui->tabs_height; scrollbar_margin = mui->scrollbar_width; scrollbar_height = total_height / (content_height / total_height); y = total_height * mui->scroll_y / content_height; /* apply a margin on the top and bottom of the scrollbar for aestetic */ scrollbar_height -= scrollbar_margin * 2; y += scrollbar_margin; if (content_height >= total_height) { /* if the scrollbar is extremely short, display it as a square */ if (scrollbar_height <= mui->scrollbar_width) scrollbar_height = mui->scrollbar_width; mui_render_quad(mui, width - mui->scrollbar_width - scrollbar_margin, header_height + y, mui->scrollbar_width, scrollbar_height, width, height, coord_color); } }
static void mui_render(void *data) { size_t i = 0; float delta_time, dt; unsigned bottom, width, height, header_height; mui_handle_t *mui = (mui_handle_t*)data; settings_t *settings = config_get_ptr(); if (!mui) return; video_driver_get_size(&width, &height); menu_animation_ctl(MENU_ANIMATION_CTL_DELTA_TIME, &delta_time); dt = delta_time / IDEAL_DT; menu_animation_ctl(MENU_ANIMATION_CTL_UPDATE, &dt); menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &width); menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &height); menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); if (settings->menu.pointer.enable) { int16_t pointer_y = menu_input_pointer_state(MENU_POINTER_Y_AXIS); float old_accel_val, new_accel_val; unsigned new_pointer_val = (pointer_y - mui->line_height + mui->scroll_y - 16) / mui->line_height; menu_input_ctl(MENU_INPUT_CTL_POINTER_ACCEL_READ, &old_accel_val); menu_input_ctl(MENU_INPUT_CTL_POINTER_PTR, &new_pointer_val); mui->scroll_y -= old_accel_val / 60.0; new_accel_val = old_accel_val * 0.96; menu_input_ctl(MENU_INPUT_CTL_POINTER_ACCEL_WRITE, &new_accel_val); } if (settings->menu.mouse.enable) { int16_t mouse_y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); unsigned new_pointer_val = (mouse_y - mui->line_height + mui->scroll_y - 16) / mui->line_height; menu_input_ctl(MENU_INPUT_CTL_MOUSE_PTR, &new_pointer_val); } if (mui->scroll_y < 0) mui->scroll_y = 0; bottom = menu_entries_get_end() * mui->line_height - height + header_height + mui->tabs_height; if (mui->scroll_y > bottom) mui->scroll_y = bottom; if (menu_entries_get_end() * mui->line_height < height - header_height - mui->tabs_height) mui->scroll_y = 0; if (menu_entries_get_end() < height / mui->line_height) { } else i = mui->scroll_y / mui->line_height; menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &i); }
static void rmenu_render(void) { bool msg_force; size_t begin, end, i, j, selection; struct font_params font_parms = {0}; char title[256] = {0}; char title_buf[256] = {0}; char title_msg[64] = {0}; menu_handle_t *menu = menu_driver_get_ptr(); file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(); uint64_t *frame_count = video_driver_get_frame_count(); size_t entries_end = menu_entries_get_end(); if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return; if (!menu) return; if (!render_normal) { render_normal = true; return; } menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); if (menu_entries_needs_refresh() && menu_driver_alive() && !msg_force) return; menu_display_fb_unset_dirty(); menu_animation_clear_active(); if (!selection_buf) return; begin = (selection >= (ENTRIES_HEIGHT / 2)) ? (selection - (ENTRIES_HEIGHT / 2)) : 0; end = ((selection + ENTRIES_HEIGHT) <= entries_end) ? selection + ENTRIES_HEIGHT : entries_end; if (entries_end <= ENTRIES_HEIGHT) begin = 0; if (end - begin > ENTRIES_HEIGHT) end = begin + ENTRIES_HEIGHT; menu_entries_get_title(title, sizeof(title)); menu_animation_ticker_str(title_buf, RMENU_TERM_WIDTH, *frame_count / 15, title, true); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; video_driver_set_osd_msg(title_buf, &font_parms, NULL); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MAX - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; menu_entries_get_core_title(title_msg, sizeof(title_msg)); video_driver_set_osd_msg(title_msg, &font_parms, NULL); j = 0; for (i = begin; i < end; i++, j++) { char entry_path[PATH_MAX_LENGTH] = {0}; char entry_value[PATH_MAX_LENGTH] = {0}; char message[PATH_MAX_LENGTH] = {0}; char entry_title_buf[PATH_MAX_LENGTH] = {0}; char type_str_buf[PATH_MAX_LENGTH] = {0}; unsigned entry_spacing = menu_entry_get_spacing(i); bool entry_selected = menu_entry_is_currently_selected(i); menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); menu_animation_ticker_str(entry_title_buf, RMENU_TERM_WIDTH - (entry_spacing + 1 + 2), *frame_count / 15, entry_path, entry_selected); menu_animation_ticker_str(type_str_buf, entry_spacing, *frame_count / 15, entry_value, entry_selected); snprintf(message, sizeof(message), "%c %s", entry_selected ? '>' : ' ', entry_title_buf); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET + (POSITION_OFFSET * j); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; video_driver_set_osd_msg(message, &font_parms, NULL); font_parms.x = POSITION_EDGE_CENTER + POSITION_OFFSET; video_driver_set_osd_msg(type_str_buf, &font_parms, NULL); } }
static void glui_render(void) { int bottom; unsigned width, height; glui_handle_t *glui = NULL; menu_display_t *disp = menu_display_get_ptr(); menu_framebuf_t *frame_buf = menu_display_fb_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); menu_input_t *menu_input = menu_input_get_ptr(); settings_t *settings = config_get_ptr(); if (!menu || !menu->userdata) return; video_driver_get_size(&width, &height); glui = (glui_handle_t*)menu->userdata; menu_animation_update(disp->animation, disp->animation->delta_time / IDEAL_DT); /* TODO/FIXME - we don't use framebuffer at all * for GLUI, we should refactor this dependency * away. */ frame_buf->width = width; frame_buf->height = height; if (settings->menu.pointer.enable) { menu_input->pointer.ptr = (menu_input->pointer.y - glui->line_height + menu->scroll_y - 16) / glui->line_height; if (menu_input->pointer.dragging) menu->scroll_y -= menu_input->pointer.dy; } if (settings->menu.mouse.enable) { if (menu_input->mouse.scrolldown) menu->scroll_y += 10; if (menu_input->mouse.scrollup) menu->scroll_y -= 10; menu_input->mouse.ptr = (menu_input->mouse.y - glui->line_height + menu->scroll_y - 16) / glui->line_height; } if (menu_entries_get_end() < height / glui->line_height) menu_entries_set_start(0); if (menu->scroll_y < 0) menu->scroll_y = 0; bottom = menu_entries_get_end() * glui->line_height - height + disp->header_height * 2; if (menu->scroll_y > bottom) menu->scroll_y = bottom; if (menu_entries_get_end() * glui->line_height < height - disp->header_height*2) menu->scroll_y = 0; }
static void rmenu_render(void) { size_t begin, end, i, j; struct font_params font_parms = {0}; char title[256] = {0}; char title_buf[256] = {0}; char title_msg[64] = {0}; menu_handle_t *menu = menu_driver_get_ptr(); menu_display_t *disp = menu_display_get_ptr(); menu_animation_t *anim = menu_animation_get_ptr(); menu_list_t *menu_list = menu_list_get_ptr(); menu_navigation_t *nav = menu_navigation_get_ptr(); global_t *global = global_get_ptr(); uint64_t frame_count = video_driver_get_frame_count(); size_t entries_end = menu_entries_get_end(); if (!menu) return; if (!render_normal) { render_normal = true; return; } if (menu_entries_needs_refresh() && menu_driver_alive() && !disp->msg_force) return; menu_display_fb_unset_dirty(); anim->is_active = false; anim->label.is_updated = false; if (!menu_list->selection_buf) return; begin = (nav->selection_ptr >= (ENTRIES_HEIGHT / 2)) ? (nav->selection_ptr - (ENTRIES_HEIGHT / 2)) : 0; end = ((nav->selection_ptr + ENTRIES_HEIGHT) <= entries_end) ? nav->selection_ptr + ENTRIES_HEIGHT : entries_end; if (entries_end <= ENTRIES_HEIGHT) begin = 0; if (end - begin > ENTRIES_HEIGHT) end = begin + ENTRIES_HEIGHT; rmenu_render_background(); menu_entries_get_title(title, sizeof(title)); menu_animation_ticker_line(title_buf, RMENU_TERM_WIDTH, frame_count / 15, title, true); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; video_driver_set_osd_msg(title_buf, &font_parms, NULL); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MAX - (POSITION_OFFSET*2); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; menu_entries_get_core_title(title_msg, sizeof(title_msg)); video_driver_set_osd_msg(title_msg, &font_parms, NULL); j = 0; for (i = begin; i < end; i++, j++) { char entry_path[PATH_MAX_LENGTH] = {0}; char entry_value[PATH_MAX_LENGTH] = {0}; char message[PATH_MAX_LENGTH] = {0}; char entry_title_buf[PATH_MAX_LENGTH] = {0}; char type_str_buf[PATH_MAX_LENGTH] = {0}; unsigned entry_spacing = menu_entry_get_spacing(i); bool entry_selected = menu_entry_is_currently_selected(i); menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); menu_animation_ticker_line(entry_title_buf, RMENU_TERM_WIDTH - (entry_spacing + 1 + 2), frame_count / 15, entry_path, entry_selected); menu_animation_ticker_line(type_str_buf, entry_spacing, frame_count / 15, entry_value, entry_selected); snprintf(message, sizeof(message), "%c %s", entry_selected ? '>' : ' ', entry_title_buf); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; font_parms.y = POSITION_EDGE_MIN + POSITION_RENDER_OFFSET + (POSITION_OFFSET * j); font_parms.scale = FONT_SIZE_NORMAL; font_parms.color = WHITE; video_driver_set_osd_msg(message, &font_parms, NULL); font_parms.x = POSITION_EDGE_CENTER + POSITION_OFFSET; video_driver_set_osd_msg(type_str_buf, &font_parms, NULL); } }
static void rmenu_xui_render(void) { size_t end, i; char title[PATH_MAX_LENGTH] = {0}; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; menu_handle_t *menu = menu_driver_get_ptr(); menu_animation_t *anim = menu_animation_get_ptr(); menu_display_t *disp = menu_display_get_ptr(); menu_framebuf_t *frame_buf = menu_display_fb_get_ptr(); menu_navigation_t *nav = menu_navigation_get_ptr(); uint64_t frame_count = video_driver_get_frame_count(); if (!menu) return; if ( menu_entries_needs_refresh() && menu_driver_alive() && !disp->msg_force ) return; menu_display_fb_unset_dirty(); anim->is_active = false; anim->label.is_updated = false; rmenu_xui_render_background(); if (XuiHandleIsValid(m_menutitle)) { menu_entries_get_title(title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); menu_animation_ticker_line(title, RXUI_TERM_WIDTH - 3, (unsigned int)frame_count / 15, title, true); } if (XuiHandleIsValid(m_menutitle)) { menu_entries_get_core_title(title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitlebottom, strw_buffer); } end = menu_entries_get_end(); for (i = 0; i < end; i++) { char entry_path[PATH_MAX_LENGTH] = {0}; char entry_value[PATH_MAX_LENGTH] = {0}; char msg_right[PATH_MAX_LENGTH] = {0}; wchar_t msg_left[PATH_MAX_LENGTH] = {0}; menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); mbstowcs(msg_left, entry_path, sizeof(msg_left) / sizeof(wchar_t)); mbstowcs(msg_right, entry_value, sizeof(msg_right) / sizeof(wchar_t)); rmenu_xui_set_list_text(i, msg_left, msg_right); } XuiListSetCurSelVisible(m_menulist, nav->selection_ptr); if (menu->keyboard.display) { char msg[1024] = {0}; const char *str = *menu->keyboard.buffer; if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", menu->keyboard.label, str); rmenu_xui_render_messagebox(msg); } }
static void glui_render(void) { float delta_time, dt; int bottom; unsigned width, height, header_height; glui_handle_t *glui = NULL; menu_handle_t *menu = menu_driver_get_ptr(); settings_t *settings = config_get_ptr(); if (!menu || !menu->userdata) return; video_driver_get_size(&width, &height); glui = (glui_handle_t*)menu->userdata; menu_animation_ctl(MENU_ANIMATION_CTL_DELTA_TIME, &delta_time); dt = delta_time / IDEAL_DT; menu_animation_ctl(MENU_ANIMATION_CTL_UPDATE, &dt); menu_display_ctl(MENU_DISPLAY_CTL_SET_WIDTH, &width); menu_display_ctl(MENU_DISPLAY_CTL_SET_HEIGHT, &height); menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); if (settings->menu.pointer.enable) { int16_t pointer_y = menu_input_pointer_state(MENU_POINTER_Y_AXIS); float old_accel_val, new_accel_val; unsigned new_pointer_val = (pointer_y - glui->line_height + menu->scroll_y - 16) / glui->line_height; menu_input_ctl(MENU_INPUT_CTL_POINTER_ACCEL_READ, &old_accel_val); menu_input_ctl(MENU_INPUT_CTL_POINTER_PTR, &new_pointer_val); menu->scroll_y -= old_accel_val / 60.0; new_accel_val = old_accel_val * 0.96; menu_input_ctl(MENU_INPUT_CTL_POINTER_ACCEL_WRITE, &new_accel_val); } if (settings->menu.mouse.enable) { unsigned new_mouse_ptr = 0; bool mouse_scrolldown, mouse_scrollup; int16_t mouse_y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); menu_input_ctl(MENU_INPUT_CTL_MOUSE_SCROLL_DOWN, &mouse_scrolldown); menu_input_ctl(MENU_INPUT_CTL_MOUSE_SCROLL_UP, &mouse_scrollup); if (mouse_scrolldown) menu->scroll_y += 10; if (mouse_scrollup) menu->scroll_y -= 10; new_mouse_ptr = (mouse_y - glui->line_height + menu->scroll_y - 16) / glui->line_height; menu_input_ctl(MENU_INPUT_CTL_MOUSE_PTR, &new_mouse_ptr); } if (menu->scroll_y < 0) menu->scroll_y = 0; bottom = menu_entries_get_end() * glui->line_height - height + header_height * 2; if (menu->scroll_y > bottom) menu->scroll_y = bottom; if (menu_entries_get_end() * glui->line_height < height - header_height*2) menu->scroll_y = 0; if (menu_entries_get_end() < height / glui->line_height) menu_entries_set_start(0); else menu_entries_set_start(menu->scroll_y / glui->line_height); }
static void xui_render(void *data) { uint64_t *frame_count; bool display_kb, msg_force; unsigned fb_width; size_t end, i, selection; char title[PATH_MAX_LENGTH] = {0}; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; video_driver_ctl(RARCH_DISPLAY_CTL_GET_FRAME_COUNT, &frame_count); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); if ( menu_entries_ctl(MENU_ENTRIES_CTL_NEEDS_REFRESH, NULL) && menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL) && !msg_force ) return; menu_display_ctl(MENU_DISPLAY_CTL_UNSET_FRAMEBUFFER_DIRTY_FLAG, NULL); menu_animation_ctl(MENU_ANIMATION_CTL_CLEAR_ACTIVE, NULL); xui_render_background(); if (XuiHandleIsValid(m_menutitle)) { menu_entries_get_title(title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); menu_animation_ticker_str(title, RXUI_TERM_WIDTH(fb_width) - 3, (unsigned int)*frame_count / 15, title, true); } if (XuiHandleIsValid(m_menutitle)) { if (menu_entries_get_core_title(title, sizeof(title)) == 0) { mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitlebottom, strw_buffer); } } end = menu_entries_get_end(); for (i = 0; i < end; i++) { char entry_path[PATH_MAX_LENGTH] = {0}; char entry_value[PATH_MAX_LENGTH] = {0}; wchar_t msg_right[PATH_MAX_LENGTH] = {0}; wchar_t msg_left[PATH_MAX_LENGTH] = {0}; menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); mbstowcs(msg_left, entry_path, sizeof(msg_left) / sizeof(wchar_t)); mbstowcs(msg_right, entry_value, sizeof(msg_right) / sizeof(wchar_t)); xui_set_list_text(i, msg_left, msg_right); } if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return; XuiListSetCurSelVisible(m_menulist, selection); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_DISPLAY, &display_kb); if (display_kb) { char msg[1024] = {0}; const char *str = NULL, *label = NULL; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_BUFF_PTR, &str); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL, &label); if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", label, str); xui_render_messagebox(msg); } }
static void rmenu_xui_render(void) { bool display_kb, msg_force; unsigned fb_width; size_t end, i, selection; char title[PATH_MAX_LENGTH] = {0}; const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; menu_handle_t *menu = menu_driver_get_ptr(); uint64_t frame_count = video_driver_get_frame_count(); menu_display_ctl(MENU_DISPLAY_CTL_WIDTH, &fb_width); menu_display_ctl(MENU_DISPLAY_CTL_MSG_FORCE, &msg_force); if (!menu) return; if ( menu_entries_needs_refresh() && menu_driver_alive() && !msg_force ) return; menu_display_fb_unset_dirty(); menu_animation_clear_active(); rmenu_xui_render_background(); if (XuiHandleIsValid(m_menutitle)) { menu_entries_get_title(title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); menu_animation_ticker_str(title, RXUI_TERM_WIDTH(fb_width) - 3, (unsigned int)frame_count / 15, title, true); } if (XuiHandleIsValid(m_menutitle)) { if (menu_entries_get_core_title(title, sizeof(title)) == 0) { mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitlebottom, strw_buffer); } } end = menu_entries_get_end(); for (i = 0; i < end; i++) { char entry_path[PATH_MAX_LENGTH] = {0}; char entry_value[PATH_MAX_LENGTH] = {0}; char msg_right[PATH_MAX_LENGTH] = {0}; wchar_t msg_left[PATH_MAX_LENGTH] = {0}; menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); mbstowcs(msg_left, entry_path, sizeof(msg_left) / sizeof(wchar_t)); mbstowcs(msg_right, entry_value, sizeof(msg_right) / sizeof(wchar_t)); rmenu_xui_set_list_text(i, msg_left, msg_right); } if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return; XuiListSetCurSelVisible(m_menulist, selection); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_DISPLAY, &display_kb); if (display_kb) { char msg[1024] = {0}; const char *str = NULL, *label = NULL; menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_BUFF_PTR, &str); menu_input_ctl(MENU_INPUT_CTL_KEYBOARD_LABEL, &label); if (!str) str = ""; snprintf(msg, sizeof(msg), "%s\n%s", menu->keyboard.label, str); rmenu_xui_render_messagebox(msg); } }