static char text[BUFSIZ] = "";
static int bh, mw, mh;
static int inputw, promptw;
-static int lines = 0;
static size_t cursor = 0;
static const char *font = NULL;
static const char *prompt = NULL;
static const char *normfgcolor = "#000000";
static const char *selbgcolor = "#0066ff";
static const char *selfgcolor = "#ffffff";
+static unsigned int lines = 0;
static unsigned long normcol[ColLast];
static unsigned long selcol[ColLast];
static Atom utf8;
static Item *matches, *matchend;
static Item *prev, *curr, *next, *sel;
static Window win;
+static XIC xic;
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
void
keypress(XKeyEvent *ev) {
char buf[32];
- KeySym ksym;
+ int len;
+ KeySym ksym = NoSymbol;
+ Status status;
- XLookupString(ev, buf, sizeof buf, &ksym, NULL);
+ len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
+ if(status == XBufferOverflow)
+ return;
if(ev->state & ControlMask) {
KeySym lower, upper;
switch(ksym) {
default:
if(!iscntrl(*buf))
- insert(buf, strlen(buf));
+ insert(buf, len);
break;
case XK_Delete:
if(text[cursor] == '\0')
if(items)
items[i].text = NULL;
inputw = maxstr ? textw(dc, maxstr) : 0;
+ lines = MIN(lines, i);
}
void
run(void) {
XEvent ev;
- while(!XNextEvent(dc->dpy, &ev))
+ while(!XNextEvent(dc->dpy, &ev)) {
+ if(XFilterEvent(&ev, win))
+ continue;
switch(ev.type) {
case Expose:
if(ev.xexpose.count == 0)
XRaiseWindow(dc->dpy, win);
break;
}
+ }
}
void
setup(void) {
int x, y, screen = DefaultScreen(dc->dpy);
Window root = RootWindow(dc->dpy, screen);
- XSetWindowAttributes wa;
+ XSetWindowAttributes swa;
+ XIM xim;
#ifdef XINERAMA
int n;
XineramaScreenInfo *info;
if((info = XineramaQueryScreens(dc->dpy, &n))) {
int i, di;
unsigned int du;
- Window dw;
+ Window w, dw;
+ XWindowAttributes wa;
- XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
+ XGetInputFocus(dc->dpy, &w, &di);
+ if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa))
+ XTranslateCoordinates(dc->dpy, w, root, wa.x, wa.y, &x, &y, &dw);
+ else
+ XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du);
for(i = 0; i < n-1; i++)
if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height))
break;
match();
/* menu window */
- wa.override_redirect = True;
- wa.background_pixmap = ParentRelative;
- wa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
+ swa.override_redirect = True;
+ swa.background_pixmap = ParentRelative;
+ swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
win = XCreateWindow(dc->dpy, root, x, y, mw, mh, 0,
DefaultDepth(dc->dpy, screen), CopyFromParent,
DefaultVisual(dc->dpy, screen),
- CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
+ CWOverrideRedirect | CWBackPixmap | CWEventMask, &swa);
+
+ /* input methods */
+ xim = XOpenIM(dc->dpy, NULL, NULL, NULL);
+ xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing,
+ XNClientWindow, win, XNFocusWindow, win, NULL);
XMapRaised(dc->dpy, win);
resizedc(dc, mw, mh);