void mp_dvdnav_update_mouse_pos(stream_t *stream, int32_t x, int32_t y, int* button) { dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv; dvdnav_t *nav = priv->dvdnav; dvdnav_status_t status; pci_t *pci = dvdnav_get_current_nav_pci(nav); if(!pci) return; status = dvdnav_mouse_select(nav, pci, x, y); if(status == DVDNAV_STATUS_OK) dvdnav_get_current_highlight(nav, button); else *button = -1; priv->mousex = x; priv->mousey = y; }
static void dvdnav_get_highlight (dvdnav_priv_t *priv, int display_mode) { pci_t *pnavpci = NULL; dvdnav_highlight_event_t *hlev = &(priv->hlev); int btnum; if (!priv || !priv->dvdnav) return; pnavpci = dvdnav_get_current_nav_pci (priv->dvdnav); if (!pnavpci) return; dvdnav_get_current_highlight (priv->dvdnav, &(hlev->buttonN)); hlev->display = display_mode; /* show */ #ifdef GEKKO // always hide button highlight hlev->sx = hlev->ex = 0; hlev->sy = hlev->ey = 0; hlev->palette = hlev->buttonN = 0; #else if (hlev->buttonN > 0 && pnavpci->hli.hl_gi.btn_ns > 0 && hlev->display) { for (btnum = 0; btnum < pnavpci->hli.hl_gi.btn_ns; btnum++) { btni_t *btni = &(pnavpci->hli.btnit[btnum]); if (hlev->buttonN == btnum + 1) { hlev->sx = FFMIN (btni->x_start, btni->x_end); hlev->ex = FFMAX (btni->x_start, btni->x_end); hlev->sy = FFMIN (btni->y_start, btni->y_end); hlev->ey = FFMAX (btni->y_start, btni->y_end); hlev->palette = (btni->btn_coln == 0) ? 0 : pnavpci->hli.btn_colit.btn_coli[btni->btn_coln - 1][0]; break; } } } else { /* hide button or no button */ hlev->sx = hlev->ex = 0; hlev->sy = hlev->ey = 0; hlev->palette = hlev->buttonN = 0; } #endif }
int mp_dvdnav_handle_input(stream_t *stream, int cmd, int *button) { dvdnav_priv_t * priv=(dvdnav_priv_t*)stream->priv; dvdnav_t *nav = priv->dvdnav; dvdnav_status_t status=DVDNAV_STATUS_ERR; pci_t *pci = dvdnav_get_current_nav_pci(nav); int reset = 0; if(cmd != MP_CMD_DVDNAV_SELECT && !pci) return 0; switch(cmd) { case MP_CMD_DVDNAV_UP: status = dvdnav_upper_button_select(nav, pci); break; case MP_CMD_DVDNAV_DOWN: status = dvdnav_lower_button_select(nav, pci); break; case MP_CMD_DVDNAV_LEFT: status = dvdnav_left_button_select(nav, pci); break; case MP_CMD_DVDNAV_RIGHT: status = dvdnav_right_button_select(nav, pci); break; case MP_CMD_DVDNAV_MENU: status = dvdnav_menu_call(nav,DVD_MENU_Root); reset = 1; break; case MP_CMD_DVDNAV_PREVMENU: { int title=0, part=0; dvdnav_current_title_info(nav, &title, &part); if(title) { if(dvdnav_menu_call(nav, DVD_MENU_Part) == DVDNAV_STATUS_OK || dvdnav_menu_call(nav, DVD_MENU_Title) == DVDNAV_STATUS_OK) { reset = 1; break; } } if(dvdnav_menu_call(nav, DVD_MENU_Root) == DVDNAV_STATUS_OK) reset = 1; } break; case MP_CMD_DVDNAV_SELECT: status = dvdnav_button_activate(nav, pci); if(status == DVDNAV_STATUS_OK) reset = 1; break; case MP_CMD_DVDNAV_MOUSECLICK: /* this is a workaround: in theory the simple dvdnav_lower_button_select()+dvdnav_button_activate() should be enough (and generally it is), but there are cases when the calls to dvdnav_lower_button_select() and friends fail! Hence we have to call dvdnav_mouse_activate(priv->mousex, priv->mousey) with the coodinates saved by mp_dvdnav_update_mouse_pos(). This last call always works well */ status = dvdnav_mouse_activate(nav, pci, priv->mousex, priv->mousey); if(status == DVDNAV_STATUS_OK) reset = 1; break; default: mp_msg(MSGT_CPLAYER, MSGL_V, "Unknown DVDNAV cmd %d\n", cmd); break; } if(status == DVDNAV_STATUS_OK) dvdnav_get_current_highlight(nav, button); return reset; }