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 max_line_length (char* msg) { rp_screen *s = current_screen (); size_t i; size_t start; int ret = 0; /* Count each line and keep the length of the longest one. */ for(start=0, i=0; i <= strlen(msg); i++) { if(msg[i] == '\n' || msg[i] == '\0') { int current_width; /* Check if this line is the longest so far. */ current_width = rp_text_width (s, defaults.font, msg + start, i - start); if(current_width > ret) { ret = current_width; } /* Update the start of the new line. */ start = i + 1; } } return ret; }
static void get_mark_box (char *msg, size_t mark_start, size_t mark_end, int *x, int *y, int *width, int *height) { rp_screen *s = current_screen (); int start, end; int mark_end_is_new_line = 0; int start_line; int end_line; int start_pos_in_line; int end_pos_in_line; int start_line_beginning; int end_line_beginning; /* If the mark_end is on a new line or the end of the string, then back it up one character. */ if (msg[mark_end-1] == '\n' || mark_end == strlen (msg)) { mark_end--; mark_end_is_new_line = 1; } start_line = count_lines(msg, mark_start); end_line = count_lines(msg, mark_end); start_pos_in_line = pos_in_line(msg, mark_start); end_pos_in_line = pos_in_line(msg, mark_end); start_line_beginning = line_beginning(msg, mark_start); end_line_beginning = line_beginning(msg, mark_end); PRINT_DEBUG (("start_line = %d, end_line = %d\n", start_line, end_line)); PRINT_DEBUG (("start_line_beginning = %d, end_line_beginning = %d\n", start_line_beginning, end_line_beginning)); if (mark_start == 0 || start_pos_in_line == 0) start = 0; else start = rp_text_width (s, defaults.font, &msg[start_line_beginning], start_pos_in_line) + defaults.bar_x_padding; end = rp_text_width (s, defaults.font, &msg[end_line_beginning], end_pos_in_line) + defaults.bar_x_padding * 2; if (mark_end != strlen (msg)) end -= defaults.bar_x_padding; /* A little hack to highlight to the end of the line, if the mark_end is at the end of a line. */ if (mark_end_is_new_line) { *width = max_line_length(msg) + defaults.bar_x_padding * 2; } else { *width = end - start; } *x = start; *y = (start_line - 1) * FONT_HEIGHT (s) + defaults.bar_y_padding; *height = (end_line - start_line + 1) * FONT_HEIGHT (s); }