#include #include #include #include "global.h" #ifdef SFX #include "special_effects.h" #endif #ifdef EYE_CANDY #include "eye_candy_wrapper.h" #endif int console_root_win = -1; int console_out_id = 40; int console_in_id = 41; int nr_console_lines; int scroll_up_lines = 0; int console_text_changed = 0; int console_text_width = -1; int locked_to_console = 0; void clear_console(){ console_text_changed = 1; lines_to_show = 0; not_from_the_end_console= 0; scroll_up_lines = 0; } void update_console_win (text_message * msg) { int nlines = rewrap_message(msg, chat_zoom, console_text_width, NULL); if (msg->deleted) { if (scroll_up_lines > nlines) { scroll_up_lines -= nlines; } else { scroll_up_lines = 0; console_text_changed = 1; } } else { if (scroll_up_lines == 0) { console_text_changed = 1; } else { scroll_up_lines += nlines; } } } int display_console_handler (window_info *win) { static int msg = 0, offset = 0; const unsigned char *sep_string = (unsigned char*)"^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^"; // are we actively drawing things? if (SDL_GetAppState () & SDL_APPACTIVE) { set_font(chat_font); // switch to the chat font if (console_text_changed) { find_line_nr (total_nr_lines, total_nr_lines - nr_console_lines - scroll_up_lines, FILTER_ALL, &msg, &offset, chat_zoom, console_text_width); text_field_set_buf_pos (console_root_win, console_out_id, msg, offset); console_text_changed = 0; } draw_console_pic (cons_text); if (scroll_up_lines != 0) { glColor3f (1.0, 1.0, 1.0); draw_string_zoomed_clipped (10, 10 + win->len_y - input_widget->len_y - CONSOLE_SEP_HEIGHT - hud_y, sep_string, -1, win->len_x - hud_x - 20, CONSOLE_SEP_HEIGHT, chat_zoom); } //ttlanhil: disabled, until the scrolling in console is adusted to work with filtering properly //if the users prefer that console not be filtered, the following line can be removed. //if they want it filtered, then more work can be done until it works properly //((text_field*)((widget_find(console_root_win, console_out_id))->widget_info))->chan_nr = current_filter; draw_hud_interface (); set_font (0); // switch to fixed } #ifdef SFX if(special_effects){ display_special_effects(0); } #endif //SFX // remember the time stamp to improve FPS quality when switching modes next_fps_time=cur_time+1000; last_count=0; #ifdef EYE_CANDY ec_idle(); #endif //EYE_CANDY #ifdef NEW_LIGHTING light_idle(); #endif // NEW_LIGHTING draw_delay = 20; return 1; } int keypress_console_handler (window_info *win, int mx, int my, Uint32 key, Uint32 unikey) { Uint16 keysym = key & 0xffff; // first try the keypress handler for all root windows if ( keypress_root_common (key, unikey) ) { return 1; } else if(keysym == SDLK_UP) { if (total_nr_lines > nr_console_lines + scroll_up_lines) { scroll_up_lines++; console_text_changed = 1; } } else if (keysym == SDLK_DOWN) { if(scroll_up_lines > 0) { scroll_up_lines--; console_text_changed = 1; } } else if (key == K_TABCOMPLETE && input_text_line.len > 0) { do_tab_complete(&input_text_line); } else if (key&ELW_ALT && keysym == SDLK_PAGEUP && total_nr_lines > nr_console_lines + scroll_up_lines) { scroll_up_lines = total_nr_lines - nr_console_lines; console_text_changed = 1; } else if (key&ELW_ALT && keysym == SDLK_PAGEDOWN && scroll_up_lines > 0) { scroll_up_lines = 0; console_text_changed = 1; } else if (keysym == SDLK_PAGEUP && total_nr_lines > nr_console_lines + scroll_up_lines) { scroll_up_lines += nr_console_lines - 1; if (nr_console_lines + scroll_up_lines > total_nr_lines) scroll_up_lines = total_nr_lines - nr_console_lines; console_text_changed = 1; } else if (keysym == SDLK_PAGEDOWN && scroll_up_lines > 0) { scroll_up_lines -= nr_console_lines - 1; if (scroll_up_lines < 0) scroll_up_lines = 0; console_text_changed = 1; } else if (key == K_MAP) { if (!locked_to_console && switch_to_game_map()) { hide_window (console_root_win); show_window (map_root_win); } } else { Uint8 ch = key_to_char (unikey); reset_tab_completer(); if ((ch == '`' || key == K_CONSOLE) && !locked_to_console) { hide_window (console_root_win); show_window (game_root_win); // Undo stupid quickbar hack if ( !get_show_window (quickbar_win) ) show_window (quickbar_win); if ( !get_show_window (quickspell_win) ) show_window (quickspell_win); } else if ( !text_input_handler (key, unikey) ) { // nothing we can handle return 0; } } // we handled it, return 1 to let the window manager know return 1; } int resize_console_handler (window_info *win, int width, int height) { widget_resize (console_root_win, console_out_id, width - hud_x - 20, height - HUD_MARGIN_Y - input_widget->len_y - CONSOLE_SEP_HEIGHT - 10); widget_resize (console_root_win, input_widget->id, width - hud_x, input_widget->len_y); widget_move (console_root_win, input_widget->id, 0, height-input_widget->len_y-hud_y); nr_console_lines = (int) (height - input_widget->len_y - CONSOLE_SEP_HEIGHT - hud_y - 10) / (DEFAULT_FONT_Y_LEN * chat_zoom); console_text_width = (int) (width - hud_x - 20); return 1; } int click_console_handler (window_info *win, int mx, int my, Uint32 flags) { if ( (flags & ELW_WHEEL_UP) && total_nr_lines > nr_console_lines + scroll_up_lines ) { scroll_up_lines++; console_text_changed = 1; } else if ( (flags & ELW_WHEEL_DOWN) && scroll_up_lines > 0 ) { scroll_up_lines--; console_text_changed = 1; } else { return 0; // we didn't handle it } return 1; } int show_console_handler (window_info *win) { int i; for (i=0; i < MAX_CHAT_TABS; i++) { if (channels[i].open) { tab_set_label_color_by_id (chat_win, chat_tabcollection_id, channels[i].tab_id, -1.0f, -1.0f, -1.0f); } } hide_window(book_win); hide_window(paper_win); hide_window(color_race_win); if (use_windowed_chat == 1) { display_tab_bar (); } widget_move_win(input_widget->window_id, input_widget->id, console_root_win); input_widget->OnResize = input_field_resize; widget_resize (input_widget->window_id, input_widget->id, win->len_x-HUD_MARGIN_X, input_widget->len_y); widget_move (input_widget->window_id, input_widget->id, 0, win->len_y-input_widget->len_y-HUD_MARGIN_Y); widget_set_flags(input_widget->window_id, input_widget->id, (TEXT_FIELD_BORDER|INPUT_DEFAULT_FLAGS)^WIDGET_CLICK_TRANSPARENT); return 1; } void create_console_root_window (int width, int height) { if (console_root_win < 0) { console_root_win = create_window ("Console", -1, -1, 0, 0, width, height, ELW_TITLE_NONE|ELW_SHOW_LAST); set_window_handler (console_root_win, ELW_HANDLER_DISPLAY, &display_console_handler); set_window_handler (console_root_win, ELW_HANDLER_KEYPRESS, &keypress_console_handler); set_window_handler (console_root_win, ELW_HANDLER_RESIZE, &resize_console_handler); set_window_handler (console_root_win, ELW_HANDLER_CLICK, &click_console_handler); set_window_handler (console_root_win, ELW_HANDLER_SHOW, &show_console_handler); console_out_id = text_field_add_extended (console_root_win, console_out_id, NULL, 10, 25, width - hud_x - 20, height - INPUT_HEIGHT - CONSOLE_SEP_HEIGHT - hud_y - 10, 0, chat_zoom, -1.0f, -1.0f, -1.0f, display_text_buffer, DISPLAY_TEXT_BUFFER_SIZE, CHAT_ALL, 0, 0, -1.0f, -1.0f, -1.0f); if(input_widget == NULL) { Uint32 id; id = text_field_add_extended(console_root_win, 0, NULL, 0, height-INPUT_HEIGHT-hud_y, width-hud_x, INPUT_HEIGHT, (INPUT_DEFAULT_FLAGS|TEXT_FIELD_BORDER)^WIDGET_CLICK_TRANSPARENT, chat_zoom, 0.77f, 0.57f, 0.39f, &input_text_line, 1, FILTER_ALL, INPUT_MARGIN, INPUT_MARGIN, 1.0, 1.0, 1.0); input_widget = widget_find(console_root_win, id); input_widget->OnResize = input_field_resize; } else { widget_move_win(input_widget->window_id, input_widget->id, console_root_win); widget_resize (input_widget->window_id, input_widget->id, width-HUD_MARGIN_X, input_widget->len_y); widget_move (input_widget->window_id, input_widget->id, 0, height-input_widget->len_y-HUD_MARGIN_Y); } widget_set_OnKey(input_widget->window_id, input_widget->id, chat_input_key); widget_set_flags(input_widget->window_id, input_widget->id, (TEXT_FIELD_BORDER|INPUT_DEFAULT_FLAGS)^WIDGET_CLICK_TRANSPARENT); nr_console_lines = (int) (height - input_widget->len_y - CONSOLE_SEP_HEIGHT - hud_y - 10) / (18 * chat_zoom); console_text_width = (int) (width - hud_x - 20); } } int input_field_resize(widget_list *w, Uint32 x, Uint32 y) { window_info *console_win = &windows_list.window[console_root_win]; widget_list *console_out_w = widget_find(console_root_win, console_out_id); text_field *tf = w->widget_info; text_message *msg = &(tf->buffer[tf->msg]); int tmp_chan = msg->chan_idx; // set invalid width to force rewrap msg->wrap_width = 0; //Set to CHAT_NONE so rewrap_message doesn't mess with total_nr_lines. msg->chan_idx = CHAT_NONE; tf->nr_lines = rewrap_message(msg, w->size, w->len_x - 2 * tf->x_space, &tf->cursor); msg->chan_idx = tmp_chan; if(use_windowed_chat != 2) { window_info *win = &windows_list.window[w->window_id]; widget_move(input_widget->window_id, input_widget->id, 0, win->len_y-input_widget->len_y-HUD_MARGIN_Y); } widget_resize(console_root_win, console_out_id, console_out_w->len_x, console_win->len_y-HUD_MARGIN_Y-input_widget->len_y-CONSOLE_SEP_HEIGHT-10); nr_console_lines = (int) console_out_w->len_y / (DEFAULT_FONT_Y_LEN * chat_zoom); console_text_changed = 1; return 1; } int history_grep(char * text, int len) { unsigned int i = 0, wraps = 1; int idx = last_message; while(*text == ' '){ text++; } if(strlen(text)<2){return 1;} for (i = 0; i <= total_nr_lines; ++i){ if (++wraps >= display_text_buffer[idx].wrap_lines){ wraps = 1; --idx; if(idx < 0){ if(buffer_full){ idx %= DISPLAY_TEXT_BUFFER_SIZE; } else { break; } } } if (i <= scroll_up_lines){ continue; } if(get_string_occurance(text, display_text_buffer[idx].data, strlen(display_text_buffer[idx].data)-1, 1)>=0){ if(i > total_nr_lines - nr_console_lines){ scroll_up_lines = total_nr_lines - nr_console_lines; } else { scroll_up_lines = i+1; } console_text_changed = 1; break; } } return 1; }