Index: src/actions.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/actions.c,v retrieving revision 1.185 diff -r1.185 actions.c 647c647 < marked_message_printf (0, 0, " definekey: keymap '%s' not found ", token); --- > message_printf (" definekey: keymap '%s' not found ", token); 679c679 < marked_message_printf (0, 0, " definekey: unknown key '%s' ", keydesc); --- > message_printf (" definekey: unknown key '%s' ", keydesc); 703c703 < marked_message_printf (0, 0, " definekey: key '%s' is not bound ", keydesc); --- > message_printf (" definekey: key '%s' is not bound ", keydesc); 725c725 < marked_message (" FIXME: unimplemented command ",0,8); --- > message_printf (" FIXME: unimplemented command "); 736c736 < marked_message_printf (0, 0, " source: %s : %s ", data, strerror(errno)); --- > message_printf (" source: %s : %s ", data, strerror(errno)); 954c954 < marked_message_printf (0, 0, " select: unknown window '%s' ", str); --- > message_printf ( " select: unknown window '%s' ", str); 1046a1047 > 1082,1084c1083,1089 < sbuf_concat (s, alias_list[i].alias); < if (rest != NULL) < sbuf_printf_concat (s, " %s", rest); --- > if (strstr(alias_list[i].alias, "%s")) { > sbuf_printf(s, alias_list[i].alias, rest); > } else { > sbuf_concat (s, alias_list[i].alias); > if (rest != NULL) > sbuf_printf_concat (s, " %s", rest); > } 1108c1113 < marked_message_printf (0, 0, MESSAGE_UNKNOWN_COMMAND, cmd); --- > message_printf (MESSAGE_UNKNOWN_COMMAND, cmd); 1352c1357 < marked_message_printf (0, 0, " %s ", msg); --- > message_printf ( " %s ", msg); 1549c1554 < marked_message_printf (0, 0, " escape: unknown key '%s' ", data); --- > message_printf (" escape: unknown key '%s' ", data); 1560c1565 < marked_message_printf (0, 0, " %s ", data); --- > message_printf (" %s ", data); 1900c1905 < marked_message_printf (0, 0, " help: keymap '%s' not found ", data); --- > message_printf (" help: keymap '%s' not found ", data); 2062c2067 < marked_message_printf (0, 0, " rudeness: invalid level '%s' ", data); --- > message_printf (" rudeness: invalid level '%s' ", data); 2687c2692 < marked_message_printf (0, 0, " %s ", value); --- > message_printf (" %s ", value); 2720c2725 < marked_message_printf (0, 0, " chdir: %s : %s ", dir, strerror(errno)); --- > message_printf (" chdir: %s : %s ", dir, strerror(errno)); 2749,2751c2754,2756 < marked_message_printf (0, 0, " (%d, %d) No window ", < current_screen()->root_attr.width, < current_screen()->root_attr.height); --- > message_printf ( " (%d, %d) No window ", > current_screen()->root_attr.width, > current_screen()->root_attr.height); 2756,2757c2761,2762 < marked_message_printf (0, 0, " (%d,%d) %d(%s) %s", win->width, win->height, < win->number, window_name (win), win->transient ? "Transient ":""); --- > message_printf ( " (%d,%d) %d(%s) %s", win->width, win->height, > win->number, window_name (win), win->transient ? "Transient ":""); 3359c3364 < marked_message_printf (0, 0, " fselect: No such frame (%d) ", fnum); --- > message_printf ( " fselect: No such frame (%d) ", fnum); 3639d3643 < int mark_start = 0, mark_end = 0; 3650,3652d3653 < if (cur == rp_current_group) < mark_start = strlen (sbuf_get (buffer)); < 3676,3678d3676 < < if (cur == rp_current_group) < mark_end = strlen (sbuf_get (buffer)); 3684c3682 < marked_message (sbuf_get (buffer), mark_start, mark_end); --- > message_printf (sbuf_get (buffer)); 3771c3769 < marked_message_printf (0, 0, " addhook: unknown hook \"%s\"", token); --- > message_printf (" addhook: unknown hook \"%s\"", token); 3814c3812 < marked_message_printf (0, 0, " remhook: unknown hook \"%s\"", token); --- > message_printf (" remhook: unknown hook \"%s\"", token); 3879c3877 < marked_message_printf (0, 0, " listhook: unknown hook \"%s\" ", str); --- > message_printf (" listhook: unknown hook \"%s\" ", str); 3902c3900 < marked_message (sbuf_get (buffer), 0, 0); --- > message_printf (sbuf_get (buffer)); 3978c3976 < marked_message_printf (0, 0, " readkey: Unknown keymap '%s' ", data); --- > message_printf (" readkey: Unknown keymap '%s' ", data); 4011c4009 < marked_message_printf (0, 0, " %s unbound key ", keysym_name); --- > message_printf (" %s unbound key ", keysym_name); 4032c4030 < marked_message_printf (0, 0, " newkmap: '%s' already exists ", data); --- > message_printf (" newkmap: '%s' already exists ", data); 4062c4060 < marked_message_printf (0, 0, " delkmap: Unknown keymap '%s' ", data); --- > message_printf (" delkmap: Unknown keymap '%s' ", data); Index: src/bar.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/bar.c,v retrieving revision 1.46 diff -r1.46 bar.c 23d22 < 36a36,37 > #define ANSI_ESC 27 > 44,45c45,47 < static int last_mark_start = 0; < static int last_mark_end = 0; --- > > static void wrapped_message (char *msg); > 176d177 < marked_message (sbuf_get (bar_buffer), mark_start, mark_end); 181d181 < marked_message (sbuf_get (bar_buffer), mark_start, mark_end); 183a184 > wrapped_message (sbuf_get (bar_buffer)); 185d185 < /* marked_message (sbuf_get (bar_buffer), mark_start, mark_end); */ 190,196c190 < message (char *s) < { < marked_message (s, 0, 0); < } < < void < marked_message_printf (int mark_start, int mark_end, char *fmt, ...) --- > message_printf (char *fmt, ...) 204,205c198 < < marked_message (buffer, mark_start, mark_end); --- > wrapped_message (buffer); 215,217d207 < if (len < 1) < return 1; < 219,221c209 < { < if (msg[i] == '\n') ret++; < } --- > if (msg[i] == '\n') ret++; 227c215 < static int --- > int 230,235c218,223 < int i; < int start; < int ret = 0; < < /* Count each line and keep the length of the longest one. */ < for(start=0, i=0; i <= strlen(msg); i++) --- > int ret=0; > int i=0; > int j=0; > char tmp_buf[100]; > > for(i=0; i<=strlen(msg); ++i) 237c225,230 < if(msg[i] == '\n' || msg[i] == '\0') --- > if (msg[i]!='\0' && msg[i]!='\n') > { > tmp_buf[j]=msg[i]; > j++; > } > else 239c232,233 < int current_width; --- > int k, xpos = 0 , in_escape = 0; > char *last; 241,245c235,241 < /* Check if this line is the longest so far. */ < current_width = XTextWidth (defaults.font, msg + start, i - start); < if(current_width > ret) < { < ret = current_width; --- > tmp_buf[j]='\0'; > last = &tmp_buf[0]; > for (k = 0; k < j; k++) { > if (tmp_buf[k] == ANSI_ESC && !in_escape) { > tmp_buf[k] = '\0'; > xpos += XTextWidth (defaults.font, last, strlen(last)); > in_escape = 1; 247,249c243,252 < < /* Update the start of the new line. */ < start = i + 1; --- > if (in_escape) { > if (tmp_buf[k] == 'm') { > last = &tmp_buf[k+1]; > in_escape = 0; > } > } > } > xpos += XTextWidth (defaults.font, last, strlen(last)); > if (xpos > ret) ret = xpos; > j=0; 252,273c255,256 < < return ret; < } < < static int < pos_in_line (char* msg, int pos) < { < int ret; < int i; < < if(pos <= 0) < return 0; < < /* Go backwards until we hit the beginning of the string or a new < line. */ < ret = 0; < for(i=pos-1; i>=0; ret++, i--) < { < if(msg[i]=='\n') < break; < } < --- > > PRINT_DEBUG(("max_line_length: %d\n", ret)); 278,301c261 < line_beginning (char* msg, int pos) < { < int ret = 0; < int i; < < if(pos <= 0) < return 0; < < /* Go backwards until we hit a new line or the beginning of the < string. */ < for(i=pos-1; i>=0; --i) < { < if (msg[i]=='\n') < { < ret = i + 1; < break; < } < } < < return ret; < } < < static void < draw_string (rp_screen *s, char *msg) --- > get_ansi_color(rp_screen *s, int ansi_col) 303,334c263,267 < int i; < int line_no; < int start; < int line_height = FONT_HEIGHT (defaults.font); < < /* Walk through the string, print each line. */ < start = 0; < line_no = 0; < for(i=0; i < strlen(msg); ++i) < { < /* When we encounter a new line, print the text up to the new < line, and move down one line. */ < if (msg[i] == '\n') < { < XDrawString (dpy, s->bar_window, s->normal_gc, < defaults.bar_x_padding, < defaults.bar_y_padding + defaults.font->max_bounds.ascent < + line_no * line_height, < msg + start, i - start); < line_no++; < start = i + 1; < } < } < < /* Print the last line. */ < XDrawString (dpy, s->bar_window, s->normal_gc, < defaults.bar_x_padding, < defaults.bar_y_padding + defaults.font->max_bounds.ascent < + line_no * line_height, < msg + start, strlen (msg) - start); < < XSync (dpy, False); --- > XColor color, junk; > char *colours[] = {"Black", "Red", "Green", "Yellow", "Blue", "Magenta", "Cyan", "White"}; > assert(ansi_col < 8); > XAllocNamedColor (dpy, s->def_cmap, colours[ansi_col], &color, &junk); > return color.pixel; 337,338d269 < /* Move the marks if they are outside the string or if the start is < after the end. */ 340c271 < correct_mark (int msg_len, int *mark_start, int *mark_end) --- > do_ansi_escape (int escape, rp_screen *s, GC text_gc) 342,350c273,274 < /* Make sure the marks are inside the string. */ < if (*mark_start < 0) < *mark_start = 0; < < if (*mark_end < 0) < *mark_end = 0; < < if (*mark_start > msg_len) < *mark_start = msg_len; --- > int mask = 0; > XGCValues gv; 352,353c276,301 < if (*mark_end > msg_len) < *mark_end = msg_len; --- > if (escape == 0) { > /* Restore normality */ > mask = GCForeground | GCBackground; > XGetGCValues(dpy, s->normal_gc, mask, &gv); > } > > if (escape == 7) { > /* Reverse video */ > XGCValues tmp; > mask = GCForeground | GCBackground; > XGetGCValues(dpy, text_gc, mask, &tmp); > gv.background = tmp.foreground; > gv.foreground = tmp.background; > } > > if (escape >= 30 && escape < 38) { > /* Change foreground */ > gv.foreground = get_ansi_color(s, escape - 30); > mask |= GCForeground; > } > > if (escape >= 40 && escape < 48) { > /* Change background */ > gv.background = get_ansi_color(s, escape - 40); > mask |= GCBackground; > } 355,362c303,304 < /* Make sure the marks aren't reversed. */ < if (*mark_start > *mark_end) < { < int tmp; < tmp = *mark_start; < *mark_start = *mark_end; < *mark_end = tmp; < } --- > /* Error checking */ > XChangeGC(dpy, text_gc, mask, &gv); 366d307 < /* Raise the bar and put it in the right spot */ 368c309 < prepare_bar (rp_screen *s, int width, int height) --- > wrapped_message (char *msg) 370,372c311,330 < XMoveResizeWindow (dpy, s->bar_window, < bar_x (s, width), bar_y (s, height), < width, height); --- > XGCValues lgv; > GC text_gc; > rp_screen *s = current_screen (); > int i=0; > int j=0; > int num_lines; > int line_no=0; > char tmp_buf[100]; > int width = defaults.bar_x_padding * 2 + max_line_length(msg); > int line_height = (FONT_HEIGHT (defaults.font)); > int height; > int max_line = 0; > PRINT_DEBUG (("msg = %s\n", msg)); > > num_lines = count_lines(msg, strlen(msg)); > height = line_height * num_lines; > if (width > s->root_attr.width) > width = s->root_attr.width; > if (height > s->root_attr.height) > height = s->root_attr.height; 380a339,347 > /* Reset the alarm to auto-hide the bar in BAR_TIMEOUT seconds. */ > alarm (defaults.bar_timeout); > alarm_signalled = 0; > > XMoveResizeWindow (dpy, s->bar_window, > bar_x (s, width), bar_y (s, height), > width, > height + defaults.bar_y_padding * 2); > 384,408c351,354 < } < < static void < get_mark_box (char *msg, int mark_start, int mark_end, < int *x, int *y, int *width, int *height) < { < 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); --- > text_gc = XCreateGC(dpy, s->root, 0, &lgv); > XCopyGC(dpy, s->normal_gc, GCForeground | GCBackground > | GCFunction | GCLineWidth > | GCSubwindowMode | GCFont, text_gc); 410,436c356 < 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 = defaults.bar_x_padding; < else < start = XTextWidth (defaults.font, < &msg[start_line_beginning], < start_pos_in_line) + defaults.bar_x_padding; < < end = XTextWidth (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) --- > for(i=0; i<=strlen(msg); ++i) 438,442c358,411 < *width = max_line_length(msg); < } < else < { < *width = end - start; --- > if (msg[i]!='\0' && msg[i]!='\n') > { > tmp_buf[j]=msg[i]; > j++; > } > else > { > int k; > char *last; > int xpos = defaults.bar_x_padding; > int in_escape = 0; > int esc_code = 0; > > tmp_buf[j]='\0'; > last = &tmp_buf[0]; > for (k = 0; k < j; k++) { > if (tmp_buf[k] == ANSI_ESC && !in_escape) { > tmp_buf[k] = '\0'; > /* First we draw the string */ > XDrawImageString (dpy, s->bar_window, text_gc, > xpos, > defaults.bar_y_padding + defaults.font->max_bounds.ascent > + line_no * line_height, > last, strlen(last)); > xpos += XTextWidth (defaults.font, last, strlen(last)); > in_escape = 1; > esc_code = 0; > } > if (in_escape) { > if (tmp_buf[k] == 'm') { > do_ansi_escape(esc_code, s, text_gc); > last = &tmp_buf[k+1]; > in_escape = 0; > } > if (tmp_buf[k] == ';') { > do_ansi_escape(esc_code, s, text_gc); > esc_code = 0; > } > if (tmp_buf[k] >= '0' && tmp_buf[k] <= '9') { > esc_code *= 10; > esc_code += tmp_buf[k] - '0'; > } > } > } > XDrawImageString (dpy, s->bar_window, text_gc, > xpos, > defaults.bar_y_padding + defaults.font->max_bounds.ascent > + line_no * line_height, > last, strlen(last)); > xpos += XTextWidth (defaults.font, last, strlen(last)); > if (xpos > max_line) max_line = xpos; > j=0; > line_no++; > } 444,490c413,419 < < *x = start; < *y = (start_line - 1) * FONT_HEIGHT (defaults.font) + defaults.bar_y_padding; < *height = (end_line - start_line + 1) * FONT_HEIGHT (defaults.font); < } < < static void < draw_inverse_box (rp_screen *s, int x, int y, int width, int height) < { < XGCValues lgv; < GC lgc; < unsigned long mask; < < lgv.foreground = current_screen()->fg_color; < lgv.function = GXxor; < mask = GCForeground | GCFunction; < lgc = XCreateGC(dpy, s->root, mask, &lgv); < < XFillRectangle (dpy, s->bar_window, lgc, < x, y, width, height); < XFreeGC (dpy, lgc); < < lgv.foreground = s->bg_color; < lgc = XCreateGC(dpy, s->root, mask, &lgv); < < XFillRectangle (dpy, s->bar_window, lgc, < x, y, width, height); < XFreeGC (dpy, lgc); < } < < static void < draw_mark (rp_screen *s, char *msg, int mark_start, int mark_end) < { < int x, y, width, height; < < /* when this happens, there is no mark. */ < if (mark_end == 0 || mark_start == mark_end) < return; < < get_mark_box (msg, mark_start, mark_end, < &x, &y, &width, &height); < draw_inverse_box (s, x, y, width, height); < } < < static void < update_last_message (char *msg, int mark_start, int mark_end) < { --- > > XFreeGC(dpy, text_gc); > XSync (dpy, False); > > /* Keep a record of the message. */ > /* FIXME: What about multiple screens? We need a bar structure for > each screen. */ 494,495d422 < last_mark_start = mark_start; < last_mark_end = mark_end; 498,527d424 < void < marked_message (char *msg, int mark_start, int mark_end) < { < rp_screen *s = current_screen (); < int num_lines; < int width; < int height; < < PRINT_DEBUG (("msg = %s\n", msg)); < PRINT_DEBUG (("mark_start = %d, mark_end = %d\n", mark_start, mark_end)); < < /* Schedule the bar to be hidden after some amount of time. */ < reset_alarm (); < < /* Calculate the width and height of the window. */ < num_lines = count_lines (msg, strlen(msg)); < width = defaults.bar_x_padding * 2 + max_line_length(msg); < height = FONT_HEIGHT (defaults.font) * num_lines + defaults.bar_y_padding * 2; < < /* Display the string. */ < prepare_bar (s, width, height); < draw_string (s, msg); < < /* Draw the mark over the designated part of the string. */ < correct_mark (strlen (msg), &mark_start, &mark_end); < draw_mark (s, msg, mark_start, mark_end); < < /* Keep a record of the message. */ < update_last_message (msg, mark_start, mark_end); < } 541c438 < marked_message (msg, last_mark_start, last_mark_end); --- > wrapped_message (msg); 545d441 < /* Free any memory associated with the bar. */ Index: src/bar.h =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/bar.h,v retrieving revision 1.16 diff -r1.16 bar.h 24a25 > #define message(msg) message_printf (msg) 32,34c33 < void message (char *s); < void marked_message (char *s, int mark_start, int mark_end); < void marked_message_printf (int mark_start, int mark_end, char *fmt, ...); --- > void message_printf (char *fmt, ...); Index: src/editor.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/editor.c,v retrieving revision 1.5 diff -r1.5 editor.c 437c437 < marked_message_printf (0, 0, " %s ", expansion); --- > message_printf (" %s ", expansion); Index: src/events.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/events.c,v retrieving revision 1.103 diff -r1.103 events.c 160,161c160,161 < marked_message_printf (0, 0, MESSAGE_RAISE_TRANSIENT, < win->number, window_name (win)); --- > message_printf (MESSAGE_RAISE_TRANSIENT, > win->number, window_name (win)); 163,164c163,164 < marked_message_printf (0, 0, MESSAGE_RAISE_WINDOW, < win->number, window_name (win)); --- > message_printf (MESSAGE_RAISE_WINDOW, > win->number, window_name (win)); 237,238c237,238 < marked_message_printf (0, 0, MESSAGE_RAISE_TRANSIENT, < win->number, window_name (win)); --- > message_printf (MESSAGE_RAISE_TRANSIENT, > win->number, window_name (win)); 240,241c240,241 < marked_message_printf (0, 0, MESSAGE_RAISE_WINDOW, < win->number, window_name (win)); --- > message_printf (MESSAGE_RAISE_WINDOW, > win->number, window_name (win)); 363d362 < 765c764 < marked_message_printf (0,0, " /bin/sh -c \"%s\" finished (%d) ", --- > message_printf ( " /bin/sh -c \"%s\" finished (%d) ", 811c810 < marked_message_printf (0, 6, "ERROR: %s", rp_error_msg); --- > message_printf ("\x1b[34mERROR:\x1b[0m %s", rp_error_msg); Index: src/input.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/input.c,v retrieving revision 1.38 diff -r1.38 input.c 194d193 < Index: src/main.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/main.c,v retrieving revision 1.92 diff -r1.92 main.c 433c433 < marked_message_printf (0, 0, MESSAGE_WELCOME, prefix, "?"); --- > message_printf (MESSAGE_WELCOME, prefix, "?"); 435c435 < marked_message_printf (0, 0, MESSAGE_WELCOME, prefix, help); --- > message_printf (MESSAGE_WELCOME, prefix, help); 441c441 < marked_message_printf (0, 0, MESSAGE_WELCOME, prefix, ":help"); --- > message_printf (MESSAGE_WELCOME, prefix, ":help"); Index: src/manage.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/manage.c,v retrieving revision 1.79 diff -r1.79 manage.c 749,750c749,750 < marked_message_printf (0, 0, MESSAGE_MAP_TRANSIENT, < win->number, window_name (win)); --- > message_printf (MESSAGE_MAP_TRANSIENT, > win->number, window_name (win)); 752,753c752,753 < marked_message_printf (0, 0, MESSAGE_MAP_WINDOW, < win->number, window_name (win)); --- > message_printf (MESSAGE_MAP_WINDOW, > win->number, window_name (win)); Index: src/window.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/window.c,v retrieving revision 1.20 diff -r1.20 window.c 525c525 < marked_message_printf (0, 0, MESSAGE_WINDOW_INFORMATION, --- > message_printf (MESSAGE_WINDOW_INFORMATION, 643c643 < *mark_start = strlen (sbuf_get (buffer)); --- > sbuf_concat (buffer, "\x1b[7m"); 663,665c663 < { < *mark_end = strlen (sbuf_get (buffer)); < } --- > sbuf_concat (buffer, "\x1b[0m");