static void update_input_window (rp_screen *s, rp_input_line *line) { int prompt_width, input_width, total_width; int char_len = 0, height; GC lgc; XGCValues gcv; prompt_width = rp_text_width (s, line->prompt, -1); input_width = rp_text_width (s, line->buffer, line->length); total_width = defaults.bar_x_padding * 2 + prompt_width + input_width + MAX_FONT_WIDTH (defaults.font); height = (FONT_HEIGHT (s) + defaults.bar_y_padding * 2); if (RP_IS_UTF8_START (line->buffer[line->position])) do char_len++; while (RP_IS_UTF8_CONT (line->buffer[line->position + char_len])); else char_len = 1; if (total_width < defaults.input_window_size + prompt_width) { total_width = defaults.input_window_size + prompt_width; } XMoveResizeWindow (dpy, s->input_window, bar_x (s, total_width), bar_y (s, height), total_width, (FONT_HEIGHT (s) + defaults.bar_y_padding * 2)); XClearWindow (dpy, s->input_window); XSync (dpy, False); rp_draw_string (s, s->input_window, STYLE_NORMAL, defaults.bar_x_padding, defaults.bar_y_padding + FONT_ASCENT(s), line->prompt, -1); rp_draw_string (s, s->input_window, STYLE_NORMAL, defaults.bar_x_padding + prompt_width, defaults.bar_y_padding + FONT_ASCENT(s), line->buffer, line->length); gcv.function = GXxor; gcv.foreground = s->fg_color ^ s->bg_color; lgc = XCreateGC (dpy, s->input_window, GCFunction | GCForeground, &gcv); /* Draw a cheap-o cursor - MkIII */ XFillRectangle (dpy, s->input_window, lgc, defaults.bar_x_padding + prompt_width + rp_text_width (s, line->buffer, line->position), defaults.bar_y_padding, rp_text_width (s, &line->buffer[line->position], char_len), FONT_HEIGHT (s)); XFlush (dpy); XFreeGC (dpy, lgc); }
static int getbeg(XFontStruct *font, int maxw, char *str, int l, int *wret) { int n=maxw/MAX_FONT_WIDTH(font); int w; while(n<l){ w=XTextWidth(font, str, n); if(w>maxw) return n-1; *wret=w; n++; } return n; }