Hi there. I've made a patch to the gtk client that changes repeated lines in the info window into lines prefixed with number saying how many times it has been repeated. Ie: Instead of: You pray. You pray. You pray. You pray. it says: (4) You pray. There is a new command line option: -repeat that tells how many lines back it should look for repeated info, default is ten, zero turns off the feature. The code also has a hard limit set (ten in this patch, just change MAX_LINES). If a line is found to be repeated, the code will only prefix/change the line to have the new "(X) " string in front of it, it will not move the old line to the bottom. I found that to be easier to read compared to having the messages move around. Please commit it to CVS if it is acceptable. ----------------8<---------------- Index: common/client.h =================================================================== RCS file: /cvsroot/crossfire/client/common/client.h,v retrieving revision 1.12 diff -u -r1.12 client.h --- common/client.h 8 Jul 2003 12:52:35 -0000 1.12 +++ common/client.h 29 Jul 2003 11:16:39 -0000 @@ -163,7 +163,8 @@ #define CONFIG_RESISTS 27 #define CONFIG_SMOOTH 28 #define CONFIG_SPLASH 29 -#define CONFIG_NUMS 30 +#define CONFIG_REPEAT 30 +#define CONFIG_NUMS 31 /* CONFIG_LIGHTING can have several possible values - set them accordingly */ #define CFG_LT_TILE 1 Index: common/init.c =================================================================== RCS file: /cvsroot/crossfire/client/common/init.c,v retrieving revision 1.12 diff -u -r1.12 init.c --- common/init.c 25 Jun 2003 17:13:58 -0000 1.12 +++ common/init.c 29 Jul 2003 11:16:39 -0000 @@ -42,7 +42,7 @@ "mapscale", "popups", "sdl", "showicon", "tooltips", "sound", "splitinfo", "split", "show_grid", "lighting", "trim_info_window", "map_width", "map_height", "foodbeep", "darkness", "port", -"grad_color_bars", "resists", "smoothing", "nosplash" +"grad_color_bars", "resists", "smoothing", "nosplash", "repeat" }; sint16 want_config[CONFIG_NUMS], use_config[CONFIG_NUMS]; @@ -192,6 +192,7 @@ want_config[CONFIG_RESISTS] = 0; want_config[CONFIG_SMOOTH] = 0; want_config[CONFIG_SPLASH] = TRUE; + want_config[CONFIG_REPEAT] = 10; for (i=0; i<CONFIG_NUMS; i++) use_config[i] = want_config[i]; Index: gtk/gx11.c =================================================================== RCS file: /cvsroot/crossfire/client/gtk/gx11.c,v retrieving revision 1.32 diff -u -r1.32 gx11.c --- gtk/gx11.c 25 Jun 2003 17:13:58 -0000 1.32 +++ gtk/gx11.c 29 Jul 2003 11:16:42 -0000 @@ -1895,19 +1895,106 @@ * good - otherewise, performance slowly degrades. */ +#define MAX_LINES (10) + +struct s_old_lines { + char str[MAXSOCKBUF]; + guint start; + int length; + int num; + int color; +}; + void draw_info(const char *str, int color) { int ncolor = color; - + static struct s_old_lines old_lines[MAX_LINES]; + GtkWidget *info_text = NULL; + int i; + if (ncolor==NDI_WHITE) { ncolor=NDI_BLACK; } + if(use_config[CONFIG_REPEAT] > MAX_LINES) { + use_config[CONFIG_REPEAT] = MAX_LINES; + } + strcpy (last_str, str); + + /* Freeze it */ + if (use_config[CONFIG_SPLITINFO] && color != NDI_BLACK) { - if (!draw_info_freeze2){ - gtk_text_freeze (GTK_TEXT (gtkwin_info_text2)); - draw_info_freeze2=TRUE; + info_text = gtkwin_info_text2; + if (!draw_info_freeze2) { + gtk_text_freeze (GTK_TEXT (gtkwin_info_text2)); + draw_info_freeze2=TRUE; + } + } else { + info_text = gtkwin_info_text; + if (!draw_info_freeze1) { + gtk_text_freeze (GTK_TEXT (gtkwin_info_text)); + draw_info_freeze1=TRUE; } + } + + /* Less then five characters is probably a prompt... */ + if (use_config[CONFIG_REPEAT]) { + if(strlen(str) > 5 && !strchr(str, '\n')) { + for(i = 0; i < use_config[CONFIG_REPEAT]; i++) { + if (!strcmp(str, old_lines[i].str)) { + char small_buffer[10]; + int old_size; + + gtk_text_set_point(GTK_TEXT(info_text),old_lines[i].start); + + if(old_lines[i].num == 1) { + old_size = 0; + } else { + sprintf(small_buffer, "(%i) ", old_lines[i].num); + old_size = strlen(small_buffer); + gtk_text_forward_delete(GTK_TEXT(info_text), old_size); + } + + sprintf(small_buffer, "(%i) ", ++(old_lines[i].num)); + gtk_text_insert (GTK_TEXT (info_text), NULL, + &root_color[old_lines[i].color], NULL, + small_buffer , -1); + if(strlen(small_buffer) != old_size) { + int j; + for(j = i+1; j < use_config[CONFIG_REPEAT]; j++) { + old_lines[j].start += + strlen(small_buffer) - old_size; + } + } + + info2_num_chars = gtk_text_get_length(GTK_TEXT(info_text)); + gtk_text_set_point(GTK_TEXT(info_text), info2_num_chars); + return; + } + } + + memmove(&old_lines[0], &old_lines[1], + sizeof(old_lines[1]) * (use_config[CONFIG_REPEAT]-1)); + strcpy(old_lines[use_config[CONFIG_REPEAT]-1].str, str); + old_lines[use_config[CONFIG_REPEAT]-1].length = strlen(str); + old_lines[use_config[CONFIG_REPEAT]-1].start = + gtk_text_get_length(GTK_TEXT(info_text)); + old_lines[use_config[CONFIG_REPEAT]-1].color = ncolor; + old_lines[use_config[CONFIG_REPEAT]-1].num = 1; + } else { + /* Move the oldest line out of the buffer anyway */ + memmove(&old_lines[0], &old_lines[1], + sizeof(old_lines[1]) * (use_config[CONFIG_REPEAT]-1)); + *old_lines[use_config[CONFIG_REPEAT]-1].str = 0; + old_lines[use_config[CONFIG_REPEAT]-1].length = strlen(str); + old_lines[use_config[CONFIG_REPEAT]-1].start = + gtk_text_get_length(GTK_TEXT(info_text)); + old_lines[use_config[CONFIG_REPEAT]-1].color = ncolor; + old_lines[use_config[CONFIG_REPEAT]-1].num = 1; + } + } + + if (use_config[CONFIG_SPLITINFO] && color != NDI_BLACK) { if (use_config[CONFIG_TRIMINFO]) { info2_num_chars += strlen(str) + 1; /* Limit size of scrollback buffer. To be more efficient, delete a good @@ -1917,20 +2004,16 @@ if (info2_num_chars > info2_max_chars ) { gtk_text_set_point(GTK_TEXT(gtkwin_info_text2),0); gtk_text_forward_delete(GTK_TEXT(gtkwin_info_text2), (info2_num_chars - info2_max_chars) + 5000); + for(i=0; i < use_config[CONFIG_REPEAT]; i++) { + old_lines[i].start -= (info2_num_chars - info2_max_chars) + 5000; + } info2_num_chars = gtk_text_get_length(GTK_TEXT(gtkwin_info_text2)); gtk_text_set_point(GTK_TEXT(gtkwin_info_text2), info2_num_chars); fprintf(stderr,"reduced output buffer2 to %d chars\n", info1_num_chars); } } - gtk_text_insert (GTK_TEXT (gtkwin_info_text2), NULL, &root_color[ncolor], NULL, str , -1); - gtk_text_insert (GTK_TEXT (gtkwin_info_text2), NULL, &root_color[ncolor], NULL, "\n" , -1); - } else { /* all nootes in the above section apply here also */ - if (!draw_info_freeze1){ - gtk_text_freeze (GTK_TEXT (gtkwin_info_text)); - draw_info_freeze1=TRUE; - } if (use_config[CONFIG_TRIMINFO]) { info1_num_chars += strlen(str) + 1; if (info1_num_chars > info1_max_chars ) { @@ -1941,6 +2024,9 @@ to_delete++; gtk_text_set_point(GTK_TEXT(gtkwin_info_text),0); gtk_text_forward_delete(GTK_TEXT(gtkwin_info_text), to_delete); + for(i=0; i < use_config[CONFIG_REPEAT]; i++) { + old_lines[i].start -= (info2_num_chars - info2_max_chars) + 5000; + } info1_num_chars = gtk_text_get_length(GTK_TEXT(gtkwin_info_text)); gtk_text_set_point(GTK_TEXT(gtkwin_info_text), info1_num_chars); fprintf(stderr,"trim_info_window, deleted %d characters, %d remaining\n", to_delete, info1_num_chars); @@ -1955,10 +2041,10 @@ } } - - gtk_text_insert (GTK_TEXT (gtkwin_info_text), NULL, &root_color[ncolor], NULL, str , -1); - gtk_text_insert (GTK_TEXT (gtkwin_info_text), NULL, &root_color[ncolor], NULL, "\n" , -1); } + gtk_text_insert (GTK_TEXT (info_text), NULL, &root_color[ncolor], NULL, str , -1); + gtk_text_insert (GTK_TEXT (info_text), NULL, &root_color[ncolor], NULL, "\n" , -1); + } @@ -5121,6 +5207,7 @@ puts("-triminfowindow - Trims size of information window(s)"); puts("-notriminfowindow - Do not trims size of information window(s) (default)"); puts("-updatekeycodes - Update the saved bindings for this keyboard."); + puts("-repeat <num> - How many lines back we look for repeated text."); exit(0); } @@ -5353,6 +5440,14 @@ } else if (!strcmp(argv[on_arg],"-nosplash")) { want_config[CONFIG_SPLASH] = FALSE; + continue; + } + else if (!strcmp(argv[on_arg],"-repeat")) { + if (++on_arg == argc) { + fprintf(stderr,"-repeat requires a value\n"); + return 1; + } + want_config[CONFIG_REPEAT]=atoi(argv[on_arg]); continue; } else { ----------------8<---------------- /Sebastian -- .oooO o,o Oooo. ( ) \_/ ( ) (o_ "Life is not fair, but root \ ( /|\ ) / (o_ //\ password helps!" -- The BOFH \_) (_/ (/)_ V_/_ _______________________________________________ crossfire-devel mailing list crossfire-devel at lists.real-time.com https://mailman.real-time.com/mailman/listinfo/crossfire-devel