static void zrmenu_frame(void *data) { float white_bg[16]= { 0.98, 0.98, 0.98, 1, 0.98, 0.98, 0.98, 1, 0.98, 0.98, 0.98, 1, 0.98, 0.98, 0.98, 1, }; unsigned width, height, ticker_limit, i; zrmenu_handle_t *zr = (zrmenu_handle_t*)data; settings_t *settings = config_get_ptr(); bool libretro_running = menu_display_ctl( MENU_DISPLAY_CTL_LIBRETRO_RUNNING, NULL); if (!zr) return; video_driver_get_size(&width, &height); menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); zr_input_begin(&zr->ctx); zrmenu_input_gamepad(zr); zrmenu_input_mouse_movement(&zr->ctx); zrmenu_input_mouse_button(&zr->ctx); zrmenu_input_keyboard(&zr->ctx); if (width != zr->size.x || height != zr->size.y) { zr->size.x = width; zr->size.y = height; zr->size_changed = true; } zr_input_end(&zr->ctx); zrmenu_main(zr); zr_common_device_draw(&device, &zr->ctx, width, height, ZR_ANTI_ALIASING_ON); if (settings->menu.mouse.enable && (settings->video.fullscreen || !video_driver_ctl(RARCH_DISPLAY_CTL_HAS_WINDOWED, NULL))) { int16_t mouse_x = menu_input_mouse_state(MENU_MOUSE_X_AXIS); int16_t mouse_y = menu_input_mouse_state(MENU_MOUSE_Y_AXIS); zrmenu_draw_cursor(zr, &white_bg[0], mouse_x, mouse_y, width, height); } menu_display_ctl(MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR, NULL); menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL); }
int main(int argc, char *argv[]) { /* Platform */ int width, height; const char *font_path; zr_size font_height; SDL_Window *win; SDL_GLContext glContext; NVGcontext *vg = NULL; /* GUI */ struct demo_gui gui; if (argc < 2) { fprintf(stdout,"Missing TTF Font file argument: gui <path>\n"); exit(EXIT_FAILURE); } font_path = argv[1]; font_height = 10; /* SDL */ SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); win = SDL_CreateWindow("Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN); glContext = SDL_GL_CreateContext(win); SDL_GetWindowSize(win, &width, &height); /* OpenGL */ glewExperimental = 1; if (glewInit() != GLEW_OK) die("[GLEW] failed setup\n"); glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); /* nanovg */ vg = nvgCreateGLES2(NVG_ANTIALIAS|NVG_DEBUG); if (!vg) die("[NVG]: failed to init\n"); nvgCreateFont(vg, "fixed", font_path); nvgFontFace(vg, "fixed"); nvgFontSize(vg, font_height); nvgTextAlign(vg, NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); /* GUI */ memset(&gui, 0, sizeof gui); zr_command_queue_init_fixed(&gui.queue, calloc(MAX_MEMORY, 1), MAX_MEMORY); gui.font.userdata = zr_handle_ptr(vg); gui.font.width = font_get_width; nvgTextMetrics(vg, NULL, NULL, &gui.font.height); init_demo(&gui); while (gui.running) { /* Input */ SDL_Event evt; zr_input_begin(&gui.input); while (SDL_PollEvent(&evt)) { if (evt.type == SDL_WINDOWEVENT) resize(&evt); else if (evt.type == SDL_QUIT) goto cleanup; else if (evt.type == SDL_KEYUP) key(&gui.input, &evt, zr_false); else if (evt.type == SDL_KEYDOWN) key(&gui.input, &evt, zr_true); else if (evt.type == SDL_MOUSEBUTTONDOWN) btn(&gui.input, &evt, zr_true); else if (evt.type == SDL_MOUSEBUTTONUP) btn(&gui.input, &evt, zr_false); else if (evt.type == SDL_MOUSEMOTION) motion(&gui.input, &evt); else if (evt.type == SDL_TEXTINPUT) text(&gui.input, &evt); else if (evt.type == SDL_MOUSEWHEEL) zr_input_scroll(&gui.input,(float)evt.wheel.y); } zr_input_end(&gui.input); /* GUI */ SDL_GetWindowSize(win, &width, &height); run_demo(&gui); /* Draw */ glClearColor(0.4f, 0.4f, 0.4f, 1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); draw(vg, &gui.queue, width, height); SDL_GL_SwapWindow(win); } cleanup: /* Cleanup */ free(zr_buffer_memory(&gui.queue.buffer)); nvgDeleteGLES2(vg); SDL_GL_DeleteContext(glContext); SDL_DestroyWindow(win); SDL_Quit(); return 0; }
int main(int argc, char *argv[]) { long dt; long started; XWindow xw; struct demo_gui gui; /* Platform */ UNUSED(argc); UNUSED(argv); memset(&xw, 0, sizeof xw); xw.dpy = XOpenDisplay(NULL); xw.root = DefaultRootWindow(xw.dpy); xw.screen = XDefaultScreen(xw.dpy); xw.vis = XDefaultVisual(xw.dpy, xw.screen); xw.cmap = XCreateColormap(xw.dpy,xw.root,xw.vis,AllocNone); xw.swa.colormap = xw.cmap; xw.swa.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | ButtonPress | ButtonReleaseMask| ButtonMotionMask | Button1MotionMask | Button3MotionMask | Button4MotionMask | Button5MotionMask| PointerMotionMask; xw.win = XCreateWindow(xw.dpy, xw.root, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0, XDefaultDepth(xw.dpy, xw.screen), InputOutput, xw.vis, CWEventMask | CWColormap, &xw.swa); XStoreName(xw.dpy, xw.win, "X11"); XMapWindow(xw.dpy, xw.win); XGetWindowAttributes(xw.dpy, xw.win, &xw.attr); xw.width = (unsigned int)xw.attr.width; xw.height = (unsigned int)xw.attr.height; xw.surf = surface_create(xw.dpy, xw.screen, xw.win, xw.width, xw.height); xw.font = font_create(xw.dpy, "fixed"); /* GUI */ memset(&gui, 0, sizeof gui); zr_command_queue_init_fixed(&gui.queue, calloc(MAX_MEMORY, 1), MAX_MEMORY); gui.font.userdata = zr_handle_ptr(xw.font); gui.font.height = (zr_float)xw.font->height; gui.font.width = font_get_text_width; init_demo(&gui); while (gui.running) { /* Input */ XEvent evt; started = timestamp(); zr_input_begin(&gui.input); while (XCheckWindowEvent(xw.dpy, xw.win, xw.swa.event_mask, &evt)) { if (evt.type == KeyPress) key(&xw, &gui.input, &evt, zr_true); else if (evt.type == KeyRelease) key(&xw, &gui.input, &evt, zr_false); else if (evt.type == ButtonPress) btn(&gui.input, &evt, zr_true); else if (evt.type == ButtonRelease) btn(&gui.input, &evt, zr_false); else if (evt.type == MotionNotify) motion(&gui.input, &evt); else if (evt.type == Expose || evt.type == ConfigureNotify) resize(&xw, xw.surf); } zr_input_end(&gui.input); /* GUI */ run_demo(&gui); /* Draw */ XClearWindow(xw.dpy, xw.win); surface_clear(xw.surf, 0x00646464); draw(xw.surf, &gui.queue); surface_blit(xw.win, xw.surf, xw.width, xw.height); XFlush(xw.dpy); /* Timing */ dt = timestamp() - started; if (dt < DTIME) sleep_for(DTIME - dt); } free(zr_buffer_memory(&gui.queue.buffer)); font_del(xw.dpy, xw.font); surface_del(xw.surf); XUnmapWindow(xw.dpy, xw.win); XFreeColormap(xw.dpy, xw.cmap); XDestroyWindow(xw.dpy, xw.win); XCloseDisplay(xw.dpy); return 0; }
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR lpCmdLine, int shown) { LARGE_INTEGER freq; long long start; long long dt; /* GUI */ struct demo_gui gui; /* Window */ QueryPerformanceFrequency(&freq); xw.wc.style = CS_HREDRAW|CS_VREDRAW; xw.wc.lpfnWndProc = wnd_proc; xw.wc.hInstance = hInstance; xw.wc.lpszClassName = "GUI"; RegisterClass(&xw.wc); xw.hWnd = CreateWindowEx( 0, xw.wc.lpszClassName, "Demo", WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, hInstance, 0); xw.hdc = GetDC(xw.hWnd); GetClientRect(xw.hWnd, &xw.rect); xw.backbuffer = surface_new(xw.hdc, xw.rect.right, xw.rect.bottom); xw.font = font_new(xw.hdc, "Times New Roman", 14); xw.width = xw.rect.right; xw.height = xw.rect.bottom; /* GUI */ memset(&gui, 0, sizeof gui); zr_command_queue_init_fixed(&gui.queue, calloc(MAX_MEMORY, 1), MAX_MEMORY); gui.font.userdata = zr_handle_ptr(&xw); gui.font.height = (zr_float)xw.font->height; gui.font.width = font_get_text_width; init_demo(&gui); while (gui.running) { /* Input */ MSG msg; start = timestamp(freq); zr_input_begin(&gui.input); while (PeekMessage(&msg, xw.hWnd, 0, 0, PM_REMOVE)) { if (msg.message == WM_KEYDOWN) key(&gui.input, &msg, zr_true); else if (msg.message == WM_KEYUP) key(&gui.input, &msg, zr_false); else if (msg.message == WM_LBUTTONDOWN) btn(&gui.input, &msg, zr_true); else if (msg.message == WM_LBUTTONUP) btn(&gui.input, &msg, zr_false); else if (msg.message == WM_MOUSEMOVE) motion(&gui.input, &msg); else if (msg.message == WM_CHAR) text(&gui.input, &msg); TranslateMessage(&msg); DispatchMessage(&msg); } zr_input_end(&gui.input); /* GUI */ run_demo(&gui); /* Draw */ surface_begin(xw.backbuffer); surface_clear(xw.backbuffer, 100, 100, 100); draw(xw.backbuffer, &gui.queue); surface_end(xw.backbuffer, xw.hdc); /* Timing */ dt = timestamp(freq) - start; if (dt < DTIME) Sleep(DTIME - (DWORD)dt); } free(zr_buffer_memory(&gui.queue.buffer)); font_del(xw.font); surface_del(xw.backbuffer); ReleaseDC(xw.hWnd, xw.hdc); return 0; }
int main(int argc, char *argv[]) { int x,y,width, height; SDL_Window *win; SDL_GLContext glContext; NVGcontext *vg = NULL; int running = 1; unsigned int started; unsigned int dt; struct zr_user_font font; struct file_browser browser; const char *font_path; int icon_sheet; font_path = argv[1]; if (argc < 2) die("missing argument!: <font> <icons>"); /* SDL */ SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); win = SDL_CreateWindow("File Explorer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN); glContext = SDL_GL_CreateContext(win); SDL_GetWindowSize(win, &width, &height); SDL_GetWindowPosition(win, &x, &y); /* OpenGL */ glewExperimental = 1; if (glewInit() != GLEW_OK) die("[GLEW] failed setup\n"); glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); /* nanovg */ vg = nvgCreateGLES2(NVG_ANTIALIAS|NVG_DEBUG); if (!vg) die("[NVG]: failed to init\n"); nvgCreateFont(vg, "fixed", font_path); nvgFontFace(vg, "fixed"); nvgFontSize(vg, 14); nvgTextAlign(vg, NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); /* GUI */ memset(&browser, 0, sizeof browser); font.userdata.ptr = vg; nvgTextMetrics(vg, NULL, NULL, &font.height); font.width = font_get_width; file_browser_init(&browser, vg, &font, width, height); while (running) { /* Input */ SDL_Event evt; started = SDL_GetTicks(); zr_input_begin(&browser.input); while (SDL_PollEvent(&evt)) { if (evt.type == SDL_WINDOWEVENT) resize(&evt); else if (evt.type == SDL_QUIT) goto cleanup; else if (evt.type == SDL_KEYUP) key(&browser.input, &evt, zr_false); else if (evt.type == SDL_KEYDOWN) key(&browser.input, &evt, zr_true); else if (evt.type == SDL_MOUSEBUTTONDOWN) btn(&browser.input, &evt, zr_true); else if (evt.type == SDL_MOUSEBUTTONUP) btn(&browser.input, &evt, zr_false); else if (evt.type == SDL_MOUSEMOTION) motion(&browser.input, &evt); else if (evt.type == SDL_TEXTINPUT) text(&browser.input, &evt); else if (evt.type == SDL_MOUSEWHEEL) zr_input_scroll(&browser.input, evt.wheel.y); } zr_input_end(&browser.input); SDL_GetWindowSize(win, &width, &height); running = file_browser_run(&browser, width, height); /* Draw */ glClearColor(0.4f, 0.4f, 0.4f, 1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); draw(vg, &browser.queue, width, height); SDL_GL_SwapWindow(win); } cleanup: /* Cleanup */ free(browser.memory); nvgDeleteGLES2(vg); SDL_GL_DeleteContext(glContext); SDL_DestroyWindow(win); SDL_Quit(); return 0; }