From 128cf327a312599bd04ce97747f11ab83df8617f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Sat, 4 Apr 2015 21:26:11 +0200 Subject: [PATCH] (Menu) Drag to scroll with touch --- menu/drivers/glui.c | 232 ++++++++++++++++++-------------- menu/drivers/rgui.c | 41 ++++-- menu/menu_driver.h | 19 ++- menu/menu_entries_cbs_iterate.c | 1 + menu/menu_input.c | 185 +++++++++++-------------- 5 files changed, 260 insertions(+), 218 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index dd92f05987..543479efb6 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -35,10 +35,8 @@ typedef struct glui_handle { unsigned line_height; - unsigned glyph_width; unsigned margin; - unsigned term_width; - unsigned term_height; + unsigned ticker_limit; char box_message[PATH_MAX_LENGTH]; struct { @@ -81,7 +79,7 @@ static int glui_entry_iterate(unsigned action) return -1; } -static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint32_t color) +static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint32_t color, enum text_alignment text_align) { struct font_params params = {0}; @@ -90,6 +88,7 @@ static void glui_blit_line(gl_t *gl, float x, float y, const char *message, uint params.scale = 1.0; params.color = color; params.full_screen = true; + params.text_align = text_align; video_driver_set_osd_msg(message, ¶ms, NULL); } @@ -160,9 +159,9 @@ static void glui_render_background(settings_t *settings, gl->coords.color = gl->white_color_ptr; } -static void glui_draw_cursor(gl_t *gl, float x, float y) +static void glui_render_quad(gl_t *gl, int x, int y, int w, int h, + float r, float g, float b, float a) { - struct gl_coords coords; static const GLfloat vertex[] = { 0, 0, 1, 0, @@ -176,14 +175,17 @@ static void glui_draw_cursor(gl_t *gl, float x, float y) 0, 0, 1, 0, }; + + struct gl_coords coords; + GLfloat color[] = { - 1.0f, 1.0f, 1.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 1.0f, + r, g, b, a, + r, g, b, a, + r, g, b, a, + r, g, b, a, }; - glViewport(x - 5, gl->win_height - y + 5, 11, 11); + glViewport(x, gl->win_height - y - h, w, h); coords.vertices = 4; coords.vertex = vertex; @@ -204,6 +206,11 @@ static void glui_draw_cursor(gl_t *gl, float x, float y) gl->coords.color = gl->white_color_ptr; } +static void glui_draw_cursor(gl_t *gl, float x, float y) +{ + glui_render_quad(gl, x-5, y-5, 10, 10, 1, 1, 1, 1); +} + static void glui_get_message(const char *message) { glui_handle_t *glui = NULL; @@ -253,8 +260,8 @@ static void glui_render_messagebox(const char *message) if (list->elems == 0) goto end; - x = gl->win_width / 2 - strlen(list->elems[0].data) * glui->glyph_width / 2; - y = gl->win_height / 2 - list->size * glui->line_height / 2; + x = gl->win_width / 2; + y = gl->win_height / 2 - list->size * settings->video.font_size / 2; normal_color = FONT_COLOR_ARGB_TO_RGBA(settings->menu.entry_normal_color); @@ -262,7 +269,7 @@ static void glui_render_messagebox(const char *message) { const char *msg = list->elems[i].data; if (msg) - glui_blit_line(gl, x, y + i * glui->line_height, msg, normal_color); + glui_blit_line(gl, x, y + i * settings->video.font_size, msg, normal_color, TEXT_ALIGN_CENTER); } end: @@ -271,6 +278,7 @@ end: static void glui_render(void) { + int bottom; glui_handle_t *glui = NULL; gl_t *gl = NULL; menu_handle_t *menu = menu_driver_get_ptr(); @@ -289,33 +297,48 @@ static void glui_render(void) if (!gl) return; - glui->line_height = settings->video.font_size * 4 / 3; - glui->glyph_width = glui->line_height / 2; - glui->margin = gl->win_width / 20 ; - glui->term_width = (gl->win_width - glui->margin * 2) / glui->glyph_width; - glui->term_height = (gl->win_height - glui->margin * 2) / glui->line_height - 2; - menu->frame_buf.width = gl->win_width; menu->frame_buf.height = gl->win_height; - menu->mouse.ptr = (menu->mouse.y - glui->margin) / - glui->line_height - 2 + menu->begin; + if (settings->menu.pointer.enable) + { + menu->pointer.ptr = + (menu->pointer.y - glui->line_height + menu->scroll_y - 16) + / glui->line_height; - if (menu->mouse.wheeldown && menu->begin - < menu_list_get_size(menu->menu_list) - glui->term_height) - menu->begin++; + if (menu->pointer.dragging) + menu->scroll_y -= menu->pointer.dy; + } - if (menu->mouse.wheelup && menu->begin > 0) - menu->begin--; + if (settings->menu.mouse.enable) + { + if (menu->mouse.scrolldown) + menu->scroll_y += 10; - /* Do not scroll if all items are visible. */ - if (menu_list_get_size(menu->menu_list) <= glui->term_height) - menu->begin = 0; + if (menu->mouse.scrollup) + menu->scroll_y -= 10; + + menu->mouse.ptr = + (menu->mouse.y - glui->line_height + menu->scroll_y - 16) + / glui->line_height; + } + + if (menu->scroll_y < 0) + menu->scroll_y = 0; + + bottom = (menu_list_get_size(menu->menu_list)-1) * glui->line_height + - gl->win_height + menu->header_height * 2; + if (menu->scroll_y > bottom) + menu->scroll_y = bottom; + + if ((menu_list_get_size(menu->menu_list)-1) * glui->line_height + < gl->win_height - menu->header_height*2) + menu->scroll_y = 0; } static void glui_frame(void) { - unsigned x, y; + unsigned y; size_t i; char title[PATH_MAX_LENGTH], title_buf[PATH_MAX_LENGTH], title_msg[PATH_MAX_LENGTH]; @@ -323,7 +346,6 @@ static void glui_frame(void) const char *dir = NULL; const char *label = NULL; unsigned menu_type = 0; - size_t end; gl_t *gl = NULL; glui_handle_t *glui = NULL; const char *core_name = NULL; @@ -375,57 +397,16 @@ static void glui_frame(void) runloop->frames.video.current.menu.label.is_updated = false; runloop->frames.video.current.menu.framebuf.dirty = false; - end = (menu->begin + glui->term_height <= - menu_list_get_size(menu->menu_list)) ? - menu->begin + glui->term_height : - menu_list_get_size(menu->menu_list); - - menu_list_get_last_stack(menu->menu_list, &dir, &label, &menu_type); get_title(label, dir, menu_type, title, sizeof(title)); - menu_animation_ticker_line(title_buf, glui->term_width - 3, - runloop->frames.video.count / glui->margin, title, true); - glui_blit_line(gl, glui->margin * 2, glui->margin + glui->line_height, - title_buf, title_color); + glui_render_quad(gl, 0, + menu->header_height - menu->scroll_y + glui->line_height * + menu->navigation.selection_ptr - glui->line_height / 2 - 4, + gl->win_width, glui->line_height, 1, 1, 1, 0.1); - core_name = global->menu.info.library_name; - if (!core_name) - core_name = global->system.info.library_name; - if (!core_name) - core_name = "No Core"; - - if (settings->menu.core_enable) - { - core_version = global->menu.info.library_version; - if (!core_version) - core_version = global->system.info.library_version; - if (!core_version) - core_version = ""; - - snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, - core_name, core_version); - - glui_blit_line(gl, - glui->margin * 2, - glui->margin + glui->term_height * glui->line_height - + glui->line_height * 2, title_msg, title_color); - } - - if (settings->menu.timedate_enable) - { - disp_timedate_set_label(timedate, sizeof(timedate), 0); - glui_blit_line(gl, - glui->margin * 14, - glui->margin + glui->term_height * glui->line_height - + glui->line_height * 2, timedate, hover_color); - } - - x = glui->margin; - y = glui->margin + glui->line_height * 2; - - for (i = menu->begin; i < end; i++, y += glui->line_height) + for (i = 0; i < menu_list_get_size(menu->menu_list); i++) { char message[PATH_MAX_LENGTH], type_str[PATH_MAX_LENGTH], entry_title_buf[PATH_MAX_LENGTH], type_str_buf[PATH_MAX_LENGTH], @@ -451,17 +432,63 @@ static void glui_frame(void) selected = (i == menu->navigation.selection_ptr); - menu_animation_ticker_line(entry_title_buf, glui->term_width - (w + 1 + 2), - runloop->frames.video.count / glui->margin, path_buf, selected); - menu_animation_ticker_line(type_str_buf, w, - runloop->frames.video.count / glui->margin, type_str, selected); + menu_animation_ticker_line(entry_title_buf, glui->ticker_limit, + runloop->frames.video.count / 100, path_buf, selected); + menu_animation_ticker_line(type_str_buf, glui->ticker_limit, + runloop->frames.video.count / 100, type_str, selected); strlcpy(message, entry_title_buf, sizeof(message)); - glui_blit_line(gl, x, y, message, selected ? hover_color : normal_color); + y = menu->header_height - menu->scroll_y + (glui->line_height * i); - glui_blit_line(gl, gl->win_width - glui->glyph_width * w - glui->margin , - y, type_str_buf, selected ? hover_color : normal_color); + glui_blit_line(gl, glui->margin, y, message, + selected ? hover_color : normal_color, TEXT_ALIGN_LEFT); + + glui_blit_line(gl, gl->win_width - glui->margin, y, type_str_buf, + selected ? hover_color : normal_color, TEXT_ALIGN_RIGHT); + } + + glui_render_quad(gl, 0, 0, gl->win_width, + menu->header_height - glui->line_height/2 - 4, 0.2, 0.2, 0.2, 1); + + menu_animation_ticker_line(title_buf, glui->ticker_limit, + runloop->frames.video.count / 100, title, true); + glui_blit_line(gl, gl->win_width/2, glui->line_height, title_buf, title_color, TEXT_ALIGN_CENTER); + + glui_blit_line(gl, glui->margin, glui->line_height, "BACK", title_color, TEXT_ALIGN_LEFT); + + glui_render_quad(gl, 0, + gl->win_height - (menu->header_height - glui->line_height/2 + 4), + gl->win_width, menu->header_height - glui->line_height/2 + 4, + 0.2, 0.2, 0.2, 1); + + core_name = global->menu.info.library_name; + if (!core_name) + core_name = global->system.info.library_name; + if (!core_name) + core_name = "No Core"; + + if (settings->menu.core_enable) + { + core_version = global->menu.info.library_version; + if (!core_version) + core_version = global->system.info.library_version; + if (!core_version) + core_version = ""; + + snprintf(title_msg, sizeof(title_msg), "%s - %s %s", PACKAGE_VERSION, + core_name, core_version); + + glui_blit_line(gl, glui->margin, gl->win_height - glui->line_height, title_msg, + title_color, TEXT_ALIGN_LEFT); + } + + if (settings->menu.timedate_enable) + { + disp_timedate_set_label(timedate, sizeof(timedate), 0); + glui_blit_line(gl, gl->win_width - glui->margin, + gl->win_height - glui->line_height, timedate, hover_color, + TEXT_ALIGN_RIGHT); } draw_text: @@ -512,7 +539,7 @@ static void *glui_init(void) } font_driver = (const struct font_renderer*)gl->font_driver; - menu = (menu_handle_t*)calloc(1, sizeof(*menu)); + menu = (menu_handle_t*)calloc(1, sizeof(*menu)); if (!menu) goto error; @@ -522,7 +549,12 @@ static void *glui_init(void) if (!menu->userdata) goto error; - glui = (glui_handle_t*)menu->userdata; + glui = (glui_handle_t*)menu->userdata; + + glui->line_height = 44; + glui->margin = 22; + glui->ticker_limit = 44; + menu->header_height = 88; glui->textures.bg.id = 0; if (font_driver->bind_block && font_driver->flush) @@ -562,8 +594,6 @@ static void glui_free(void *data) free(menu->userdata); } - - static void glui_context_destroy(void) { glui_handle_t *glui = NULL; @@ -606,14 +636,18 @@ static bool glui_load_wallpaper(void *data) static void glui_navigation_clear(bool pending_push) { menu_handle_t *menu = menu_driver_get_ptr(); - if (menu) - menu->begin = 0; + if (!menu) + return; + + menu->begin = 0; + menu->scroll_y = 0; } static void glui_navigation_set(bool scroll) { glui_handle_t *glui = NULL; menu_handle_t *menu = menu_driver_get_ptr(); + gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); if (!menu) return; @@ -625,16 +659,12 @@ static void glui_navigation_set(bool scroll) if (!scroll) return; - if (menu->navigation.selection_ptr < glui->term_height/2) - menu->begin = 0; - else if (menu->navigation.selection_ptr >= glui->term_height/2 - && menu->navigation.selection_ptr < - menu_list_get_size(menu->menu_list) - glui->term_height/2) - menu->begin = menu->navigation.selection_ptr - glui->term_height/2; - else if (menu->navigation.selection_ptr >= - menu_list_get_size(menu->menu_list) - glui->term_height/2) - menu->begin = menu_list_get_size(menu->menu_list) - - glui->term_height; + int half = (gl->win_height / glui->line_height) / 2; + + if (menu->navigation.selection_ptr < half) + menu->scroll_y = 0; + else + menu->scroll_y = ((menu->navigation.selection_ptr + 2 - half) * glui->line_height); } static void glui_navigation_set_last(void) diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 98cbbfc043..fa2b8d3731 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -349,6 +349,7 @@ static void rgui_blit_cursor(menu_handle_t *menu) static void rgui_render(void) { size_t i, end; + int bottom; char title[256], title_buf[256], title_msg[64]; char timedate[PATH_MAX_LENGTH]; unsigned x, y, menu_type = 0; @@ -383,19 +384,39 @@ static void rgui_render(void) runloop->frames.video.current.menu.animation.is_active = false; runloop->frames.video.current.menu.label.is_updated = false; - menu->mouse.ptr = menu->mouse.y / 11 - 2 + menu->begin; + if (settings->menu.pointer.enable) + { + menu->pointer.ptr = menu->pointer.y / 11 - 2 + menu->begin; - if (menu->mouse.scrolldown && menu->begin - < menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT) - menu->begin++; + if (menu->pointer.dragging) + { + menu->scroll_y += menu->pointer.dy; + menu->begin = -menu->scroll_y / 11 + 2; + if (menu->scroll_y > 0) + menu->scroll_y = 0; + } + } + + if (settings->menu.mouse.enable) + { + if (menu->mouse.scrolldown && menu->begin + < menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT) + menu->begin++; - if (menu->mouse.scrollup && menu->begin > 0) - menu->begin--; + if (menu->mouse.scrollup && menu->begin > 0) + menu->begin--; + + menu->mouse.ptr = menu->mouse.y / 11 - 2 + menu->begin; + } /* Do not scroll if all items are visible. */ if (menu_list_get_size(menu->menu_list) <= RGUI_TERM_HEIGHT) menu->begin = 0; + bottom = menu_list_get_size(menu->menu_list) - RGUI_TERM_HEIGHT; + if (menu->begin > bottom) + menu->begin = bottom; + end = (menu->begin + RGUI_TERM_HEIGHT <= menu_list_get_size(menu->menu_list)) ? menu->begin + RGUI_TERM_HEIGHT : @@ -546,6 +567,7 @@ static void *rgui_init(void) menu->frame_buf.width = 320; menu->frame_buf.height = 240; + menu->header_height = 11; menu->begin = 0; menu->frame_buf.pitch = menu->frame_buf.width * sizeof(uint16_t); @@ -608,8 +630,11 @@ static void rgui_set_texture(void) static void rgui_navigation_clear(bool pending_push) { menu_handle_t *menu = menu_driver_get_ptr(); - if (menu) - menu->begin = 0; + if (!menu) + return; + + menu->begin = 0; + menu->scroll_y = 0; } static void rgui_navigation_set(bool scroll) diff --git a/menu/menu_driver.h b/menu/menu_driver.h index ff5ea8ba35..4c4a47e784 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -112,6 +112,8 @@ typedef struct } delay; size_t begin; + unsigned header_height; + int scroll_y; menu_list_t *menu_list; menu_navigation_t navigation; @@ -175,13 +177,20 @@ typedef struct struct { + int16_t x; + int16_t y; + int16_t dx; + int16_t dy; int16_t old_x; int16_t old_y; - bool pressed[2]; - bool oldpressed[2]; - bool back; - bool oldback; - bool cancel; + int16_t start_x; + int16_t start_y; + bool pressed[2]; + bool oldpressed[2]; + bool dragging; + bool back; + bool oldback; + unsigned ptr; } pointer; struct diff --git a/menu/menu_entries_cbs_iterate.c b/menu/menu_entries_cbs_iterate.c index 2bce56e227..9cdcc3844d 100644 --- a/menu/menu_entries_cbs_iterate.c +++ b/menu/menu_entries_cbs_iterate.c @@ -504,6 +504,7 @@ static int action_iterate_main(const char *label, unsigned action) menu_file_list_cbs_t *cbs = NULL; menu_handle_t *menu = menu_driver_get_ptr(); global_t *global = global_get_ptr(); + settings_t *settings = config_get_ptr(); if (!menu) return 0; diff --git a/menu/menu_input.c b/menu/menu_input.c index 0e3111bd52..5eaad925e2 100644 --- a/menu/menu_input.c +++ b/menu/menu_input.c @@ -667,7 +667,7 @@ static int menu_input_mouse(unsigned *action) static int menu_input_pointer(unsigned *action) { - int pointer_device, pointer_x, pointer_y, screen_x, screen_y; + int pointer_device, pointer_x, pointer_y; const struct retro_keybind *binds[MAX_USERS]; menu_handle_t *menu = menu_driver_get_ptr(); runloop_t *runloop = rarch_main_get_ptr(); @@ -683,11 +683,6 @@ static int menu_input_pointer(unsigned *action) return 0; } -#if defined(HAVE_XMB) - if (driver->menu_ctx == &menu_ctx_xmb) - return 0; -#endif - pointer_device = driver->menu_ctx->set_texture? RETRO_DEVICE_POINTER : RARCH_DEVICE_POINTER_SCREEN; @@ -701,65 +696,12 @@ static int menu_input_pointer(unsigned *action) pointer_x = input_driver_state(binds, 0, pointer_device, 0, RETRO_DEVICE_ID_POINTER_X); pointer_y = input_driver_state(binds, 0, pointer_device, 0, RETRO_DEVICE_ID_POINTER_Y); - /* by multiple presses, the main press will be the one closest to the previous coordinates */ - if(menu->pointer.pressed[1]) - { - int pointer_x2, pointer_y2, dist1, dist2; + menu->pointer.x = ((pointer_x + 0x7fff) * (int)menu->frame_buf.width) / 0xFFFF; + menu->pointer.y = ((pointer_y + 0x7fff) * (int)menu->frame_buf.height) / 0xFFFF; - pointer_x2 = input_driver_state(binds, 0, pointer_device, 1, RETRO_DEVICE_ID_POINTER_X); - pointer_y2 = input_driver_state(binds, 0, pointer_device, 1, RETRO_DEVICE_ID_POINTER_Y); - - dist1 = (pointer_x - menu->pointer.old_x) * (pointer_x - menu->pointer.old_x) + - (pointer_y - menu->pointer.old_y) * (pointer_y - menu->pointer.old_y); - dist2 = (pointer_x2 - menu->pointer.old_x) * (pointer_x2 - menu->pointer.old_x) + - (pointer_y2 - menu->pointer.old_y) * (pointer_y2 - menu->pointer.old_y); - - if (dist2 < dist1) - { - int temp; - pointer_x = pointer_x2; - pointer_y = pointer_y2; - temp = menu->pointer.pressed[0]; - menu->pointer.pressed[0] = menu->pointer.pressed[1]; - menu->pointer.pressed[1] = temp; - } - } - menu->pointer.old_x = pointer_x; - menu->pointer.old_y = pointer_y; - - screen_x = ((pointer_x + 0x7fff) * (int)menu->frame_buf.width) / 0xFFFF; - screen_y = ((pointer_y + 0x7fff) * (int)menu->frame_buf.height) / 0xFFFF; - - if (menu->pointer.pressed[0]) - { - menu->mouse.x = screen_x; - menu->mouse.y = screen_y; - if (menu->mouse.x < 5) - menu->mouse.x = 5; - if (menu->mouse.y < 5) - menu->mouse.y = 5; - if (menu->mouse.x > (int)menu->frame_buf.width - 5) - menu->mouse.x = menu->frame_buf.width - 5; - if (menu->mouse.y > (int)menu->frame_buf.height - 5) - menu->mouse.y = menu->frame_buf.height - 5; - - menu->mouse.scrollup = (menu->mouse.y == 5); - menu->mouse.scrolldown = (menu->mouse.y == (int)menu->frame_buf.height - 5); - - menu->pointer.cancel = false; - - if(menu->pointer.oldpressed[1] && !menu->pointer.pressed[1]) - menu->pointer.back = true; - } - else - menu->pointer.cancel = screen_x < 5 || screen_x > (int)menu->frame_buf.width - 5 - || screen_x < 5 || screen_x > (int)menu->frame_buf.height - 5; - - menu->pointer.oldpressed[1] = menu->pointer.pressed[1]; - - - if (menu->pointer.pressed[0] || menu->pointer.back || menu->mouse.x != screen_x || menu->mouse.y != screen_y) - runloop->frames.video.current.menu.animation.is_active = true; + if (menu->pointer.pressed[0] || menu->pointer.back || menu->pointer.dragging + || menu->pointer.dy != 0 || menu->pointer.dx != 0) + runloop->frames.video.current.menu.animation.is_active = true; return 0; } @@ -842,61 +784,88 @@ static int menu_input_mouse_post_iterate(menu_file_list_cbs_t *cbs, return 0; } +static int pointer_tap(menu_file_list_cbs_t *cbs, const char *path, + const char *label, unsigned type, unsigned action) +{ + menu_handle_t *menu = menu_driver_get_ptr(); + + driver_t *driver = driver_get_ptr(); + rarch_setting_t *setting = + (rarch_setting_t*)setting_find_setting + (driver->menu->list_settings, + driver->menu->menu_list->selection_buf->list[menu->navigation.selection_ptr].label); + + if (menu->pointer.ptr == menu->navigation.selection_ptr + && cbs && cbs->action_toggle && setting && + (setting->type == ST_BOOL || setting->type == ST_UINT + || setting->type == ST_FLOAT || setting->type == ST_STRING)) + return cbs->action_toggle(type, label, MENU_ACTION_RIGHT, true); + else if (menu->pointer.ptr == menu->navigation.selection_ptr) + return cbs->action_ok(path, label, type, menu->navigation.selection_ptr); + else + menu->navigation.selection_ptr = menu->pointer.ptr; + + return 0; +} + static int menu_input_pointer_post_iterate(menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, unsigned action) { - menu_handle_t *menu = menu_driver_get_ptr(); - settings_t *settings = config_get_ptr(); - driver_t *driver = driver_get_ptr(); + int ret = 0; + menu_handle_t *menu = menu_driver_get_ptr(); + settings_t *settings = config_get_ptr(); if (!menu) return -1; - if (!settings->menu.pointer.enable -#ifdef HAVE_OVERLAY - || (settings->input.overlay_enable && driver && driver->overlay) -#endif - ) + if (!settings->menu.pointer.enable || settings->input.overlay_enable) return 0; -#if defined(HAVE_XMB) - if (driver->menu_ctx == &menu_ctx_xmb) - return 0; -#endif - if (menu->pointer.pressed[0]) { - if (menu->pointer.oldpressed[0]) + if (!menu->pointer.oldpressed[0]) { - if (menu->mouse.ptr <= menu_list_get_size(menu->menu_list)-1) - menu_navigation_set(&menu->navigation, menu->mouse.ptr, false); - } - else + menu->pointer.start_x = menu->pointer.x; + menu->pointer.start_y = menu->pointer.y; + menu->pointer.old_x = menu->pointer.x; + menu->pointer.old_y = menu->pointer.y; menu->pointer.oldpressed[0] = true; + } + else if (menu->pointer.x != menu->pointer.start_x + && menu->pointer.y != menu->pointer.start_y) + { + menu->pointer.dragging = true; + menu->pointer.dx = menu->pointer.x - menu->pointer.old_x; + menu->pointer.dy = menu->pointer.y - menu->pointer.old_y; + menu->pointer.old_x = menu->pointer.x; + menu->pointer.old_y = menu->pointer.y; + } } else { if (menu->pointer.oldpressed[0]) { - rarch_setting_t *setting = NULL; - + if (!menu->pointer.dragging) + { + if (menu->pointer.start_y < menu->header_height) + { + menu_list_pop_stack(menu->menu_list); + } + else if (menu->pointer.ptr <= menu_list_get_size(menu->menu_list)-1) + { + menu->pointer.oldpressed[0] = false; + ret = pointer_tap(cbs, path, label, type, action); + } + } menu->pointer.oldpressed[0] = false; - setting = (rarch_setting_t*)setting_find_setting - (menu->list_settings, - menu->menu_list->selection_buf->list[menu->navigation.selection_ptr].label); - - if (menu->mouse.ptr == menu->navigation.selection_ptr && !menu->pointer.cancel - && cbs && cbs->action_toggle && setting && - (setting->type == ST_BOOL || setting->type == ST_UINT || setting->type == ST_FLOAT - || setting->type == ST_STRING)) - return cbs->action_toggle(type, label, MENU_ACTION_RIGHT, true); - if (menu->mouse.ptr == menu->navigation.selection_ptr && !menu->pointer.cancel - && cbs && cbs->action_ok) - return cbs->action_ok(path, label, type, - menu->navigation.selection_ptr); - else if (menu->mouse.ptr <= menu_list_get_size(menu->menu_list) - 1) - menu_navigation_set(&menu->navigation, menu->mouse.ptr, false); + menu->pointer.start_x = 0; + menu->pointer.start_y = 0; + menu->pointer.old_x = 0; + menu->pointer.old_y = 0; + menu->pointer.dx = 0; + menu->pointer.dy = 0; + menu->pointer.dragging = false; } } @@ -910,14 +879,18 @@ static int menu_input_pointer_post_iterate(menu_file_list_cbs_t *cbs, } menu->pointer.oldback = menu->pointer.back; - return 0; + return ret; } void menu_input_post_iterate(int *ret, menu_file_list_cbs_t *cbs, const char *path, const char *label, unsigned type, unsigned action) { - *ret = menu_input_mouse_post_iterate (cbs, path, label, type, action); - *ret |= menu_input_pointer_post_iterate(cbs, path, label, type, action); + settings_t *settings = config_get_ptr(); + + if (settings->menu.mouse.enable) + *ret = menu_input_mouse_post_iterate (cbs, path, label, type, action); + if (settings->menu.pointer.enable) + *ret |= menu_input_pointer_post_iterate(cbs, path, label, type, action); } unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input) @@ -934,6 +907,7 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input) | (1ULL << RETRO_DEVICE_ID_JOYPAD_R); menu_handle_t *menu = menu_driver_get_ptr(); driver_t *driver = driver_get_ptr(); + settings_t *settings = config_get_ptr(); if (!menu || !driver) return 0; @@ -1002,8 +976,11 @@ unsigned menu_input_frame(retro_input_t input, retro_input_t trigger_input) else ret = MENU_ACTION_NOOP; - menu_input_mouse(&ret); - menu_input_pointer(&ret); + if (settings->menu.mouse.enable) + menu_input_mouse(&ret); + + if (settings->menu.pointer.enable) + menu_input_pointer(&ret); return ret; }