summaryrefslogtreecommitdiff
path: root/ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui.c')
-rw-r--r--ui.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/ui.c b/ui.c
index 80d6267..f3f3943 100644
--- a/ui.c
+++ b/ui.c
@@ -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);