xlib: add delta_time_seconds

This commit is contained in:
PROP 65 2024-08-29 03:09:28 +00:00 committed by GitHub
parent b3b400895d
commit d043803932
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 26 additions and 20 deletions

View File

@ -76,10 +76,10 @@ NK_API void nk_xfont_del(Display *dpy, XFont *font);
#ifndef NK_X11_DOUBLE_CLICK_LO #ifndef NK_X11_DOUBLE_CLICK_LO
#define NK_X11_DOUBLE_CLICK_LO 20 #define NK_X11_DOUBLE_CLICK_LO 0.02
#endif #endif
#ifndef NK_X11_DOUBLE_CLICK_HI #ifndef NK_X11_DOUBLE_CLICK_HI
#define NK_X11_DOUBLE_CLICK_HI 200 #define NK_X11_DOUBLE_CLICK_HI 0.20
#endif #endif
typedef struct XSurface XSurface; typedef struct XSurface XSurface;
@ -131,15 +131,16 @@ static struct {
Visual *vis; Visual *vis;
Colormap cmap; Colormap cmap;
#endif #endif
long last_button_click; double last_button_click;
double time_of_last_frame;
} xlib; } xlib;
NK_INTERN long NK_INTERN double
nk_timestamp(void) nk_get_time(void)
{ {
struct timeval tv; struct timeval tv;
if (gettimeofday(&tv, NULL) < 0) return 0; if (gettimeofday(&tv, NULL) < 0) return 0;
return (long)((long)tv.tv_sec * 1000 + (long)tv.tv_usec/1000); return ((double)tv.tv_sec + (double)tv.tv_usec/1000000);
} }
NK_INTERN unsigned long NK_INTERN unsigned long
@ -747,6 +748,7 @@ nk_xlib_init(XFont *xfont, Display *dpy, int screen, Window root,
XFreePixmap(dpy, blank);} XFreePixmap(dpy, blank);}
xlib.surf = nk_xsurf_create(screen, w, h); xlib.surf = nk_xsurf_create(screen, w, h);
nk_init_default(&xlib.ctx, font); nk_init_default(&xlib.ctx, font);
xlib.time_of_last_frame = nk_get_time();
return &xlib.ctx; return &xlib.ctx;
} }
@ -878,10 +880,10 @@ nk_xlib_handle_event(Display *dpy, int screen, Window win, XEvent *evt)
const int x = evt->xbutton.x, y = evt->xbutton.y; const int x = evt->xbutton.x, y = evt->xbutton.y;
if (evt->xbutton.button == Button1) { if (evt->xbutton.button == Button1) {
if (down) { /* Double-Click Button handler */ if (down) { /* Double-Click Button handler */
long dt = nk_timestamp() - xlib.last_button_click; float dt = nk_get_time() - xlib.last_button_click;
if (dt > NK_X11_DOUBLE_CLICK_LO && dt < NK_X11_DOUBLE_CLICK_HI) if (dt > NK_X11_DOUBLE_CLICK_LO && dt < NK_X11_DOUBLE_CLICK_HI)
nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_true); nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_true);
xlib.last_button_click = nk_timestamp(); xlib.last_button_click = nk_get_time();
} else nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_false); } else nk_input_button(ctx, NK_BUTTON_DOUBLE, x, y, nk_false);
nk_input_button(ctx, NK_BUTTON_LEFT, x, y, down); nk_input_button(ctx, NK_BUTTON_LEFT, x, y, down);
} else if (evt->xbutton.button == Button2) } else if (evt->xbutton.button == Button2)
@ -990,6 +992,10 @@ nk_xlib_render(Drawable screen, struct nk_color clear)
struct nk_context *ctx = &xlib.ctx; struct nk_context *ctx = &xlib.ctx;
XSurface *surf = xlib.surf; XSurface *surf = xlib.surf;
double now = nk_get_time();
xlib.ctx.delta_time_seconds = now - xlib.time_of_last_frame;
xlib.time_of_last_frame = now;
nk_xsurf_clear(xlib.surf, nk_color_from_byte(&clear.r)); nk_xsurf_clear(xlib.surf, nk_color_from_byte(&clear.r));
nk_foreach(cmd, &xlib.ctx) nk_foreach(cmd, &xlib.ctx)
{ {