diff options
Diffstat (limited to 'ui.c')
| -rw-r--r-- | ui.c | 56 |
1 files changed, 38 insertions, 18 deletions
@@ -18,18 +18,21 @@ static XSizeHints szhint; static GC gc; static Atom wm_delete_window; -static Font freg, fital; +static XFontStruct *freg, *fital; /* TODO: center menu on screen */ void -ui_init(int argc, char **argv) +ui_init(int argc, char **argv, UiOpts opt) { dsp = XOpenDisplay(NULL); scr = DefaultScreen(dsp); fg = BlackPixel(dsp, scr); bg = WhitePixel(dsp, scr); + int scr_width = XWidthOfScreen(ScreenOfDisplay(dsp, scr)); + int scr_height = XHeightOfScreen(ScreenOfDisplay(dsp, scr)); + szhint = (XSizeHints) { 0 }; szhint.width = 350; szhint.height = 250; @@ -52,15 +55,32 @@ ui_init(int argc, char **argv) XSetBackground(dsp, gc, bg); XSetForeground(dsp, gc, fg); - /* TODO: quit events, how do they work? */ XSelectInput(dsp, win, KeyPressMask | ExposureMask); XMapRaised(dsp, win); wm_delete_window = XInternAtom(dsp, "WM_DELETE_WINDOW", False); XSetWMProtocols(dsp, win, &wm_delete_window, 1); - freg = XLoadFont(dsp, "-*-new century schoolbook-medium-r-*-*-24-*-*-*-*-*-*-*"); - fital = XLoadFont(dsp, "-*-new century schoolbook-medium-i-*-*-24-*-*-*-*-*-*-*"); + /* TODO: error checking */ + freg = XLoadQueryFont(dsp, "-*-new century schoolbook-medium-r-*-*-24-*-*-*-*-*-*-*"); + fital = XLoadQueryFont(dsp, "-*-new century schoolbook-medium-i-*-*-24-*-*-*-*-*-*-*"); + + int w = 0; + for (int i = 0; i < opt.n; i++) { + int ow = XTextWidth(freg, opt.v[i].s, opt.v[i].n); + if (ow > w) w = ow; + } + + int h = 24 * (opt.n + 1); + int margin = 64; + if (w > scr_width - 2*margin) w = scr_width - 2*margin; + if (h > scr_height - 2*margin) h = scr_height - 2*margin; + + XMoveResizeWindow(dsp, win, + (scr_width - w - 32) / 2, + (scr_height - h - 32) / 2, + w + 32, h + 32 + ); } UiKey @@ -82,6 +102,8 @@ xksym_to_uik(KeySym sym) } } +/* TODO: allow selecting options with mouse */ + int ui_wait_event(UiEvent *e) { @@ -124,23 +146,21 @@ ui_draw(Str input, int inpi, int seli, UiOpts o) /* draw input */ - XSetFont(dsp, gc, fital); - XDrawString(dsp, win, gc, 16, 24, input.s, input.n); - XFontStruct *f = XQueryFont(dsp, XGContextFromGC(gc)); - int w = XTextWidth(f, input.s, inpi); - XDrawLine(dsp, win, gc, 16 + w, 24 - f->ascent, 16 + w, 24 + f->descent); + XSetFont(dsp, gc, fital->fid); + XDrawString(dsp, win, gc, 16, 32, input.s, input.n); + int w = XTextWidth(fital, input.s, inpi); + XDrawLine(dsp, win, gc, + 16 + w, 32 - fital->ascent, + 16 + w, 32 + fital->descent); /* draw options */ - XSetFont(dsp, gc, freg); + XSetFont(dsp, gc, freg->fid); for (int i = 0; i < o.n; i++) { if (i == seli) { - int w = XTextWidth(XQueryFont(dsp, - XGContextFromGC(gc)), - o.v[i].s, o.v[i].n); + int w = XTextWidth(freg, o.v[i].s, o.v[i].n); XFillRectangle(dsp, win, gc, - 16, 28 + i * 24 + 8, - w, 24); + 16, 28 + i * 24 + 8, w, 24); XSetForeground(dsp, gc, bg); XDrawString(dsp, win, gc, 16, 48 + i * 24 + 8, @@ -157,8 +177,8 @@ ui_draw(Str input, int inpi, int seli, UiOpts o) void ui_fini(void) { - XUnloadFont(dsp, freg); - XUnloadFont(dsp, fital); + XFreeFont(dsp, freg); + XFreeFont(dsp, fital); XFreeGC(dsp, gc); XDestroyWindow(dsp, win); XCloseDisplay(dsp); |
