-       xw.xic = XCreateIC(xw.xim, XNInputStyle, XIMPreeditNothing
-                                          | XIMStatusNothing, XNClientWindow, xw.win,
-                                          XNFocusWindow, xw.win, NULL);
-       if(xw.xic == NULL)
-               die("XCreateIC failed. Could not obtain input method.\n");
-
-       /* white cursor, black outline */
-       cursor = XCreateFontCursor(xw.dpy, XC_xterm);
-       XDefineCursor(xw.dpy, xw.win, cursor);
-       XRecolorCursor(xw.dpy, cursor,
-               &(XColor){.red = 0xffff, .green = 0xffff, .blue = 0xffff},
-               &(XColor){.red = 0x0000, .green = 0x0000, .blue = 0x0000});
-
-       xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False);
-       xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False);
-       XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
-
-       xresettitle();
-       XMapWindow(xw.dpy, xw.win);
-       xhints();
-       XSync(xw.dpy, 0);
-}
-
-void
-xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
-       int winx = borderpx + x * xw.cw, winy = borderpx + y * xw.ch,
-           width = charlen * xw.cw, xp, i;
-       int frp, frcflags;
-       int u8fl, u8fblen, u8cblen, doesexist;
-       char *u8c, *u8fs;
-       long u8char;
-       Font *font = &dc.font;
-       FcResult fcres;
-       FcPattern *fcpattern, *fontpattern;
-       FcFontSet *fcsets[] = { NULL };
-       FcCharSet *fccharset;
-       Colour *fg = &dc.col[base.fg], *bg = &dc.col[base.bg],
-                *temp, revfg, revbg;
-       XRenderColor colfg, colbg;
-
-       frcflags = FRC_NORMAL;
-
-       if(base.mode & ATTR_BOLD) {
-               if(BETWEEN(base.fg, 0, 7)) {
-                       /* basic system colors */
-                       fg = &dc.col[base.fg + 8];
-               } else if(BETWEEN(base.fg, 16, 195)) {
-                       /* 256 colors */
-                       fg = &dc.col[base.fg + 36];
-               } else if(BETWEEN(base.fg, 232, 251)) {
-                       /* greyscale */
-                       fg = &dc.col[base.fg + 4];
-               }
-               /*
-                * Those ranges will not be brightened:
-                *      8 - 15 – bright system colors
-                *      196 - 231 – highest 256 color cube
-                *      252 - 255 – brightest colors in greyscale
-                */
-               font = &dc.bfont;
-               frcflags = FRC_BOLD;
-       }
-
-       if(base.mode & ATTR_ITALIC) {
-               font = &dc.ifont;
-               frcflags = FRC_ITALIC;
-       }
-       if((base.mode & ATTR_ITALIC) && (base.mode & ATTR_BOLD)) {
-               font = &dc.ibfont;
-               frcflags = FRC_ITALICBOLD;
-       }
-
-       if(IS_SET(MODE_REVERSE)) {
-               if(fg == &dc.col[defaultfg]) {
-                       fg = &dc.col[defaultbg];
-               } else {
-                       colfg.red = ~fg->color.red;
-                       colfg.green = ~fg->color.green;
-                       colfg.blue = ~fg->color.blue;
-                       colfg.alpha = fg->color.alpha;
-                       XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg);
-                       fg = &revfg;
-               }
-
-               if(bg == &dc.col[defaultbg]) {
-                       bg = &dc.col[defaultfg];
-               } else {
-                       colbg.red = ~bg->color.red;
-                       colbg.green = ~bg->color.green;
-                       colbg.blue = ~bg->color.blue;
-                       colbg.alpha = bg->color.alpha;
-                       XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &revbg);
-                       bg = &revbg;
-               }
-       }
-
-       if(base.mode & ATTR_REVERSE) {
-               temp = fg;
-               fg = bg;
-               bg = temp;
-       }
-
-       /* Intelligent cleaning up of the borders. */
-       if(x == 0) {
-               xclear(0, (y == 0)? 0 : winy, borderpx,
-                       winy + xw.ch + ((y >= term.row-1)? xw.h : 0));
-       }
-       if(x + charlen >= term.col) {
-               xclear(winx + width, (y == 0)? 0 : winy, xw.w,
-                       ((y >= term.row-1)? xw.h : (winy + xw.ch)));
-       }
-       if(y == 0)
-               xclear(winx, 0, winx + width, borderpx);
-       if(y == term.row-1)
-               xclear(winx, winy + xw.ch, winx + width, xw.h);
-
-       /* Clean up the region we want to draw to. */
-       XftDrawRect(xw.draw, bg, winx, winy, width, xw.ch);
-
-       fcsets[0] = font->set;
-       for(xp = winx; bytelen > 0;) {
-               /*
-                * Search for the range in the to be printed string of glyphs
-                * that are in the main font. Then print that range. If
-                * some glyph is found that is not in the font, do the
-                * fallback dance.
-                */
-               u8fs = s;
-               u8fblen = 0;
-               u8fl = 0;
-               for(;;) {
-                       u8c = s;
-                       u8cblen = utf8decode(s, &u8char);
-                       s += u8cblen;
-                       bytelen -= u8cblen;
-
-                       doesexist = XftCharIndex(xw.dpy, font->match, u8char);
-                       if(!doesexist || bytelen <= 0) {
-                               if(bytelen <= 0) {
-                                       if(doesexist) {
-                                               u8fl++;
-                                               u8fblen += u8cblen;
-                                       }
-                               }
-
-                               if(u8fl > 0) {
-                                       XftDrawStringUtf8(xw.draw, fg,
-                                                       font->match, xp,
-                                                       winy + font->ascent,
-                                                       (FcChar8 *)u8fs,
-                                                       u8fblen);
-                                       xp += font->width * u8fl;
-                               }
-                               break;
-                       }
-
-                       u8fl++;
-                       u8fblen += u8cblen;
-               }
-               if(doesexist)
-                       break;
-
-               frp = frccur;
-               /* Search the font cache. */
-               for(i = 0; i < frclen; i++, frp--) {
-                       if(frp <= 0)
-                               frp = LEN(frc) - 1;
-
-                       if(frc[frp].c == u8char
-                                       && frc[frp].flags == frcflags) {
-                               break;
-                       }
-               }
-
-               /* Nothing was found. */
-               if(i >= frclen) {
-                       /*
-                        * Nothing was found in the cache. Now use
-                        * some dozen of Fontconfig calls to get the
-                        * font for one single character.
-                        */
-                       fcpattern = FcPatternDuplicate(font->pattern);
-                       fccharset = FcCharSetCreate();
-
-                       FcCharSetAddChar(fccharset, u8char);
-                       FcPatternAddCharSet(fcpattern, FC_CHARSET,
-                                       fccharset);
-                       FcPatternAddBool(fcpattern, FC_SCALABLE,
-                                       FcTrue);
-
-                       FcConfigSubstitute(0, fcpattern,
-                                       FcMatchPattern);
-                       FcDefaultSubstitute(fcpattern);
-
-                       fontpattern = FcFontSetMatch(0, fcsets,
-                                       FcTrue, fcpattern, &fcres);
-
-                       /*
-                        * Overwrite or create the new cache entry
-                        * entry.
-                        */
-                       frccur++;
-                       frclen++;
-                       if(frccur >= LEN(frc))
-                               frccur = 0;
-                       if(frclen > LEN(frc)) {
-                               frclen = LEN(frc);
-                               XftFontClose(xw.dpy, frc[frccur].font);
-                       }
-
-                       frc[frccur].font = XftFontOpenPattern(xw.dpy,
-                                       fontpattern);
-                       frc[frccur].c = u8char;
-                       frc[frccur].flags = frcflags;
-
-                       FcPatternDestroy(fcpattern);
-                       FcCharSetDestroy(fccharset);
-
-                       frp = frccur;
-               }
-
-               XftDrawStringUtf8(xw.draw, fg, frc[frp].font,
-                               xp, winy + frc[frp].font->ascent,
-                               (FcChar8 *)u8c, u8cblen);
-
-               xp += font->width;
-       }
-
-       /*
-       XftDrawStringUtf8(xw.draw, fg, font->set, winx,
-                       winy + font->ascent, (FcChar8 *)s, bytelen);
-       */
-
-       if(base.mode & ATTR_UNDERLINE) {
-               XftDrawRect(xw.draw, fg, winx, winy + font->ascent + 1,
-                               width, 1);
-       }
-}
-
-void
-xdrawcursor(void) {
-       static int oldx = 0, oldy = 0;
-       int sl;
-       Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs, 0};
-
-       LIMIT(oldx, 0, term.col-1);
-       LIMIT(oldy, 0, term.row-1);
-
-       if(term.line[term.c.y][term.c.x].state & GLYPH_SET)
-               memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ);
-
-       /* remove the old cursor */
-       if(term.line[oldy][oldx].state & GLYPH_SET) {
-               sl = utf8size(term.line[oldy][oldx].c);
-               xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx,
-                               oldy, 1, sl);
-       } else {
-               xtermclear(oldx, oldy, oldx, oldy);
-       }
-
-       /* draw the new one */
-       if(!(IS_SET(MODE_HIDE))) {
-               if(!(xw.state & WIN_FOCUSED))
-                       g.bg = defaultucs;
-
-               if(IS_SET(MODE_REVERSE))
-                       g.mode |= ATTR_REVERSE, g.fg = defaultcs, g.bg = defaultfg;
-
-               sl = utf8size(g.c);
-               xdraws(g.c, g, term.c.x, term.c.y, 1, sl);
-               oldx = term.c.x, oldy = term.c.y;
-       }
-}
-
-
-void
-xsettitle(char *p) {
-       XTextProperty prop;
-
-       Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle,
-                       &prop);
-       XSetWMName(xw.dpy, xw.win, &prop);
-}
-
-void
-xresettitle(void) {
-       xsettitle(opt_title ? opt_title : "st");
-}
-
-void
-redraw(int timeout) {
-       struct timespec tv = {0, timeout * 1000};
-
-       tfulldirt();
-       draw();
-
-       if(timeout > 0) {
-               nanosleep(&tv, NULL);
-               XSync(xw.dpy, False); /* necessary for a good tput flash */
-       }