ref: a96f72a41fed2a20c363865b5860fcbfeec7c90d
dir: /plan9/vid_menu.c/
#include <u.h> #include <libc.h> #include <stdio.h> #include "../q_shared.h" extern cvar_t *vid_fullscreen; extern cvar_t *vid_gamma; extern cvar_t *scr_viewsize; extern void M_PopMenu(void); menuframework_s vmenu; menuslider_s ssizeslide; menuslider_s gammaslide; menulist_s fullscrbox; menuaction_s applyaction; menuaction_s defaultsaction; void vmssize (void *s) { Cvar_SetValue("viewsize", ((menuslider_s *)s)->curvalue * 10); } void vmgamma (void *s) { // invert sense so greater = brighter, and scale to a range of 0.5 to 1.3 Cvar_SetValue("vid_gamma", 0.8 - (((menuslider_s *)s)->curvalue/10.0 - 0.5) + 0.5); } void vmreset (void *) { VID_MenuInit(); } void vmapply (void *) { Cvar_SetValue("vid_gamma", 0.8 - (gammaslide.curvalue/10.0 - 0.5) + 0.5); Cvar_SetValue("vid_fullscreen", fullscrbox.curvalue); M_ForceMenuOff(); } void VID_MenuInit (void) { static char *yesno[] = {"no", "yes", nil}; if(!scr_viewsize) scr_viewsize = Cvar_Get("viewsize", "100", CVAR_ARCHIVE); ssizeslide.curvalue = scr_viewsize->value/10; vmenu.x = vid.width * 0.50; vmenu.nitems = 0; ssizeslide.generic.type = MTYPE_SLIDER; ssizeslide.generic.x = 0; ssizeslide.generic.y = 20; ssizeslide.generic.name = "screen size"; ssizeslide.minvalue = 3; ssizeslide.maxvalue = 12; ssizeslide.generic.callback = vmssize; gammaslide.generic.type = MTYPE_SLIDER; gammaslide.generic.x = 0; gammaslide.generic.y = 30; gammaslide.generic.name = "gamma"; gammaslide.generic.callback = vmgamma; gammaslide.minvalue = 5; gammaslide.maxvalue = 13; gammaslide.curvalue = (1.3 - vid_gamma->value + 0.5) * 10; fullscrbox.generic.type = MTYPE_SPINCONTROL; fullscrbox.generic.x = 0; fullscrbox.generic.y = 40; fullscrbox.generic.name = "fullscreen"; fullscrbox.itemnames = yesno; fullscrbox.curvalue = vid_fullscreen->value; defaultsaction.generic.type = MTYPE_ACTION; defaultsaction.generic.name = "reset to default"; defaultsaction.generic.x = 0; defaultsaction.generic.y = 90; defaultsaction.generic.callback = vmreset; applyaction.generic.type = MTYPE_ACTION; applyaction.generic.name = "apply"; applyaction.generic.x = 0; applyaction.generic.y = 100; applyaction.generic.callback = vmapply; Menu_AddItem(&vmenu, (void *)&ssizeslide); Menu_AddItem(&vmenu, (void *)&gammaslide); Menu_AddItem(&vmenu, (void *)&fullscrbox); Menu_AddItem(&vmenu, (void *)&defaultsaction); Menu_AddItem(&vmenu, (void *)&applyaction); Menu_Center(&vmenu); vmenu.x -= 8; } void VID_MenuDraw (void) { int w, h; re.DrawGetPicSize(&w, &h, "m_banner_video"); re.DrawPic(vid.width/2 - w/2, vid.height/2 - 110, "m_banner_video"); Menu_AdjustCursor(&vmenu, 1); // starting position Menu_Draw(&vmenu); } char *VID_MenuKey (int key) { static char *sound = "misc/menu1.wav"; switch(key){ case K_ESCAPE: M_PopMenu(); return NULL; case K_UPARROW: vmenu.cursor--; Menu_AdjustCursor(&vmenu, -1); break; case K_DOWNARROW: vmenu.cursor++; Menu_AdjustCursor(&vmenu, 1); break; case K_LEFTARROW: Menu_SlideItem(&vmenu, -1); break; case K_RIGHTARROW: Menu_SlideItem(&vmenu, 1); break; case K_ENTER: Menu_SelectItem(&vmenu); break; } return sound; }