ref: abebab3746b86e330baed2e96b62f018da3a680c
dir: /cfg/cfg.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <mouse.h> #include <keyboard.h> #include <thread.h> #include "common.h" #include "nk.h" typedef struct UI UI; struct UI { UItype type; const char *label; int index; double value; double init; double min; double max; double step; int ctl; char *path; UI *child; int numchild; }; int mainstacksize = 32768; static Mousectl *mctl; static Keyboardctl *kctl; static Image *cola, *colb; static Font *f; static char **dirs; static UI topui; static struct nk_context nk; static void usage(void) { print("usage: %s [DIR]...\n", argv0); threadexitsall("usage"); } void threadmain(int argc, char **argv) { Rune key; Mouse m; Alt a[] = { { nil, &m, CHANRCV }, { nil, nil, CHANRCV }, { nil, &key, CHANRCV }, { nil, nil, CHANEND }, }; char *curdir[] = {".", nil}; int oldbuttons, x, entering; ARGBEGIN{ default: usage(); }ARGEND dirs = *argv == nil ? curdir : argv; memset(&topui, 0, sizeof(topui)); topui.type = -1; /* that one is special */ if (initdraw(nil, nil, "daw/cfg") < 0) sysfatal("initdraw: %r"); if ((mctl = initmouse(nil, screen)) == nil) sysfatal("initmouse: %r"); if ((kctl = initkeyboard(nil)) == nil) sysfatal("initkeyboard: %r"); a[0].c = mctl->c; a[1].c = mctl->resizec; a[2].c = kctl->c; f = display->defaultfont; cola = display->white; colb = display->black; srand(time(0)); threadsetname("daw/cfg"); if (!nk_init_p9(&nk)) sysfatal("nk_init_p9 failed"); oldbuttons = 0; entering = 1; for (;;) { nk_glyph g; enum nk_keys nkey; nk_input_begin(&nk); if (entering == 0) { switch (alt(a)) { case 0: /* mouse */ m.xy.x -= screen->r.min.x; m.xy.y -= screen->r.min.y; nk_input_motion(&nk, m.xy.x, m.xy.y); if ((x = (m.buttons & 1)) != (oldbuttons & 1)) nk_input_button(&nk, NK_BUTTON_LEFT, m.xy.x, m.xy.y, x); else if ((x = (m.buttons & 2)) != (oldbuttons & 2)) nk_input_button(&nk, NK_BUTTON_MIDDLE, m.xy.x, m.xy.y, x); else if ((x = (m.buttons & 4)) != (oldbuttons & 4)) nk_input_button(&nk, NK_BUTTON_RIGHT, m.xy.x, m.xy.y, x); oldbuttons = m.buttons; break; case 1: /* resize */ getwindow(display, Refnone); break; case 2: /* keyboard */ nkey = -1; switch (key) { case 'q': goto end; case Kbs: nkey = NK_KEY_BACKSPACE; break; case Kdel: nkey = NK_KEY_DEL; break; case Kleft: nkey = NK_KEY_LEFT; break; case Kright: nkey = NK_KEY_RIGHT; break; case '\n': nkey = NK_KEY_ENTER; break; default: if (runetochar(g, &key) > 0) nk_input_glyph(&nk, g); break; } if (nkey >= 0) { nk_input_key(&nk, nkey, 1); nk_input_key(&nk, nkey, 0); } } } else { entering = 0; } nk_input_end(&nk); /* that's just a test */ if (nk_begin_titled(&nk, "daw/cfg", "daw/cfg", nk_rect(0, 0, Dx(screen->r), Dy(screen->r)), 0)) { static int d = 20; nk_layout_row_template_begin(&nk, 0); nk_layout_row_template_push_dynamic(&nk); nk_layout_row_template_push_dynamic(&nk); nk_layout_row_template_end(&nk); nk_label(&nk, "Some kind of slider:", NK_TEXT_LEFT); nk_slider_int(&nk, 0, &d, 100, 1); } nk_end(&nk); nk_redraw_p9(&nk, screen); nk_clear(&nk); } end: closemouse(mctl); closekeyboard(kctl); threadexitsall(nil); }