void gc_free(GRAPHICS_CONTROLLER **p) { if (p && *p) { _gc_reset(*p); if ((*p)->overlay_proc) { (*p)->overlay_proc((*p)->overlay_proc_handle, NULL); } bd_mutex_destroy(&(*p)->mutex); X_FREE(*p); } }
void gc_free(GRAPHICS_CONTROLLER **p) { if (p && *p) { GRAPHICS_CONTROLLER *gc = *p; bd_psr_unregister_cb(gc->regs, _process_psr_event, gc); _gc_reset(gc); if (gc->overlay_proc) { gc->overlay_proc(gc->overlay_proc_handle, NULL); } bd_mutex_destroy(&gc->mutex); X_FREE(*p); } }
int gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS *cmds) { int result = -1; if (cmds) { cmds->num_nav_cmds = 0; cmds->nav_cmds = NULL; cmds->sound_id_ref = -1; cmds->status = GC_STATUS_NONE; } if (!gc) { GC_TRACE("gc_run(): no graphics controller\n"); return result; } bd_mutex_lock(&gc->mutex); /* always accept reset */ switch (ctrl) { case GC_CTRL_RESET: _gc_reset(gc); bd_mutex_unlock(&gc->mutex); return 0; default:; } /* other operations require complete display set */ if (!gc->igs || !gc->igs->ics || !gc->igs->complete) { GC_TRACE("gc_run(): no interactive composition\n"); bd_mutex_unlock(&gc->mutex); return result; } switch (ctrl) { case GC_CTRL_SET_BUTTON_PAGE: _set_button_page(gc, param); break; case GC_CTRL_VK_KEY: if (param != BD_VK_POPUP) { result = _user_input(gc, param, cmds); break; } param = !gc->popup_visible; /* fall thru (BD_VK_POPUP) */ case GC_CTRL_POPUP: if (gc->igs->ics->interactive_composition.ui_model != IG_UI_MODEL_POPUP) { /* not pop-up menu */ break; } gc->popup_visible = !!param; if (gc->popup_visible) { _select_page(gc, 0); } /* fall thru */ case GC_CTRL_NOP: result = _render_page(gc, 0xffff, cmds); break; case GC_CTRL_INIT_MENU: _select_page(gc, 0); _render_page(gc, 0xffff, cmds); break; case GC_CTRL_IG_END: _update_selected_button(gc); _render_page(gc, 0xffff, cmds); break; case GC_CTRL_ENABLE_BUTTON: _enable_button(gc, param, 1); break; case GC_CTRL_DISABLE_BUTTON: _enable_button(gc, param, 0); break; case GC_CTRL_MOUSE_MOVE: result = _mouse_move(gc, param >> 16, param & 0xffff, cmds); break; case GC_CTRL_RESET: /* already handled */ break; } if (cmds) { if (gc->igs->ics->interactive_composition.ui_model == IG_UI_MODEL_POPUP) { cmds->status |= GC_STATUS_POPUP; } if (gc->ig_drawn) { cmds->status |= GC_STATUS_MENU_OPEN; } } bd_mutex_unlock(&gc->mutex); return result; }