X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=console.c;h=dd3137dd18aeaaaf0cf0ac06fee32603da44f532;hb=f5680929fc0f74c0b26073a8dc238ed7b6815317;hp=6a59b970f4a1d72c830cd4017343ac7fc5ee1276;hpb=9b4696df9959f0c951ce4ab7a26323b41d0cc4a2;p=xonotic%2Fdarkplaces.git diff --git a/console.c b/console.c index 6a59b970..dd3137dd 100644 --- a/console.c +++ b/console.c @@ -1008,13 +1008,13 @@ static char Sys_Con_NearestColor(const unsigned char _r, const unsigned char _g, /* ================ -Con_Print +Con_MaskPrint ================ */ extern cvar_t timestamps; extern cvar_t timeformat; extern qboolean sys_nostdout; -void Con_Print(const char *msg) +void Con_MaskPrint(int additionalmask, const char *msg) { static int mask = 0; static int index = 0; @@ -1023,6 +1023,8 @@ void Con_Print(const char *msg) for (;*msg;msg++) { Con_Rcon_AddChar(*msg); + if (index == 0) + mask |= additionalmask; // if this is the beginning of a new line, print timestamp if (index == 0) { @@ -1272,6 +1274,32 @@ void Con_Print(const char *msg) } } +/* +================ +Con_MaskPrintf +================ +*/ +void Con_MaskPrintf(int mask, const char *fmt, ...) +{ + va_list argptr; + char msg[MAX_INPUTLINE]; + + va_start(argptr,fmt); + dpvsnprintf(msg,sizeof(msg),fmt,argptr); + va_end(argptr); + + Con_MaskPrint(mask, msg); +} + +/* +================ +Con_Print +================ +*/ +void Con_Print(const char *msg) +{ + Con_MaskPrint(CON_MASK_PRINT, msg); +} /* ================ @@ -1287,7 +1315,7 @@ void Con_Printf(const char *fmt, ...) dpvsnprintf(msg,sizeof(msg),fmt,argptr); va_end(argptr); - Con_Print(msg); + Con_MaskPrint(CON_MASK_PRINT, msg); } /* @@ -1297,9 +1325,10 @@ Con_DPrint */ void Con_DPrint(const char *msg) { - if (!developer.integer) - return; // don't confuse non-developers with techie stuff... - Con_Print(msg); + if(developer.integer < 0) // at 0, we still add to the buffer but hide + return; + + Con_MaskPrint(CON_MASK_DEVELOPER, msg); } /* @@ -1312,14 +1341,14 @@ void Con_DPrintf(const char *fmt, ...) va_list argptr; char msg[MAX_INPUTLINE]; - if (!developer.integer) - return; // don't confuse non-developers with techie stuff... + if(developer.integer < 0) // at 0, we still add to the buffer but hide + return; va_start(argptr,fmt); dpvsnprintf(msg,sizeof(msg),fmt,argptr); va_end(argptr); - Con_Print(msg); + Con_MaskPrint(CON_MASK_DEVELOPER, msg); } @@ -1360,9 +1389,9 @@ void Con_DrawInput (void) y = (int)strlen(text); -// fill out remainder with spaces - for (i = y; i < (int)sizeof(editlinecopy)-1; i++) - text[i] = ' '; + // append enoug nul-bytes to cover the utf8-versions of the cursor too + for (i = y; i < y + 4 && i < (int)sizeof(editlinecopy); ++i) + text[i] = 0; // add the cursor frame if ((int)(realtime*con_cursorspeed) & 1) // cursor is visible @@ -1387,12 +1416,12 @@ void Con_DrawInput (void) // text[key_linepos + 1] = 0; - x = vid_conwidth.value * 0.95 - DrawQ_TextWidth_Font(text, key_linepos, false, FONT_CONSOLE) * con_textsize.value; + x = vid_conwidth.value * 0.95 - DrawQ_TextWidth(text, key_linepos, con_textsize.value, con_textsize.value, false, FONT_CONSOLE); if(x >= 0) x = 0; // draw it - DrawQ_String_Font(x, con_vislines - con_textsize.value*2, text, 0, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, FONT_CONSOLE ); + DrawQ_String(x, con_vislines - con_textsize.value*2, text, y + 3, con_textsize.value, con_textsize.value, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, FONT_CONSOLE ); // remove cursor // key_line[key_linepos] = 0; @@ -1422,16 +1451,10 @@ float Con_WordWidthFunc(void *passthrough, const char *w, size_t *length, float ti->colorindex = -1; return ti->fontsize * ti->font->maxwidth; } - /* if(maxWidth >= 0) - return DrawQ_TextWidth_Font_UntilWidth(w, length, false, ti->font, maxWidth / ti->fontsize) * ti->fontsize; + return DrawQ_TextWidth_UntilWidth(w, length, ti->fontsize, ti->fontsize, false, ti->font, -maxWidth); // -maxWidth: we want at least one char else if(maxWidth == -1) - return DrawQ_TextWidth_Font(w, *length, false, ti->font) * ti->fontsize; - */ - if(maxWidth >= 0) - return DrawQ_TextWidth_Font_UntilWidth_Size(w, ti->fontsize, ti->fontsize, length, false, ti->font, maxWidth); - else if(maxWidth == -1) - return DrawQ_TextWidth_Font_Size(w, ti->fontsize, ti->fontsize, *length, false, ti->font); + return DrawQ_TextWidth(w, *length, ti->fontsize, ti->fontsize, false, ti->font); else { printf("Con_WordWidthFunc: can't get here (maxWidth should never be %f)\n", maxWidth); @@ -1462,9 +1485,9 @@ int Con_DisplayLineFunc(void *passthrough, const char *line, size_t length, floa { int x = (int) (ti->x + (ti->width - width) * ti->alignment); if(isContinuation && *ti->continuationString) - x += (int) DrawQ_String_Font(x, ti->y, ti->continuationString, strlen(ti->continuationString), ti->fontsize, ti->fontsize, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, ti->font); + x += (int) DrawQ_String(x, ti->y, ti->continuationString, strlen(ti->continuationString), ti->fontsize, ti->fontsize, 1.0, 1.0, 1.0, 1.0, 0, NULL, false, ti->font); if(length > 0) - DrawQ_String_Font(x, ti->y, line, length, ti->fontsize, ti->fontsize, 1.0, 1.0, 1.0, 1.0, 0, &(ti->colorindex), false, ti->font); + DrawQ_String(x, ti->y, line, length, ti->fontsize, ti->fontsize, 1.0, 1.0, 1.0, 1.0, 0, &(ti->colorindex), false, ti->font); } ti->y += ti->fontsize; @@ -1610,13 +1633,13 @@ void Con_DrawNotify (void) chatstart = 0; // shut off gcc warning } - v = notifystart + con_notifysize.value * Con_DrawNotifyRect(0, CON_MASK_INPUT | CON_MASK_HIDENOTIFY | (numChatlines ? CON_MASK_CHAT : 0), con_notifytime.value, 0, notifystart, vid_conwidth.value, con_notify.value * con_notifysize.value, con_notifysize.value, align, 0.0, ""); + v = notifystart + con_notifysize.value * Con_DrawNotifyRect(0, CON_MASK_INPUT | CON_MASK_HIDENOTIFY | (numChatlines ? CON_MASK_CHAT : 0) | CON_MASK_DEVELOPER, con_notifytime.value, 0, notifystart, vid_conwidth.value, con_notify.value * con_notifysize.value, con_notifysize.value, align, 0.0, ""); // chat? if(numChatlines) { v = chatstart + numChatlines * con_chatsize.value; - Con_DrawNotifyRect(CON_MASK_CHAT, CON_MASK_INPUT, con_chattime.value, 0, chatstart, vid_conwidth.value * con_chatwidth.value, v - chatstart, con_chatsize.value, 0.0, 1.0, /*"^3\014\014\014 "*/ "^3\xee\x80\x8d\xee\x80\x8d\xee\x80\x8d "); // 015 is ·> character in conchars.tga + Con_DrawNotifyRect(CON_MASK_CHAT, CON_MASK_INPUT, con_chattime.value, 0, chatstart, vid_conwidth.value * con_chatwidth.value, v - chatstart, con_chatsize.value, 0.0, 1.0, (utf8_enable.integer ? "^3\xee\x80\x8c\xee\x80\x8c\xee\x80\x8c " : "^3\014\014\014 ")); // 015 is ·> character in conchars.tga } if (key_dest == key_message) @@ -1636,35 +1659,13 @@ void Con_DrawNotify (void) // FIXME word wrap inputsize = (numChatlines ? con_chatsize : con_notifysize).value; - x = vid_conwidth.value - DrawQ_TextWidth_Font(temptext, 0, false, FONT_CHAT) * inputsize; + x = vid_conwidth.value - DrawQ_TextWidth(temptext, 0, inputsize, inputsize, false, FONT_CHAT); if(x > 0) x = 0; - DrawQ_String_Font(x, v, temptext, 0, inputsize, inputsize, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false, FONT_CHAT); + DrawQ_String(x, v, temptext, 0, inputsize, inputsize, 1.0, 1.0, 1.0, 1.0, 0, &colorindex, false, FONT_CHAT); } } -/* -================ -Con_MeasureConsoleLine - -Counts the number of lines for a line on the console. -================ -*/ -int Con_MeasureConsoleLine(int lineno) -{ - float width = vid_conwidth.value; - con_text_info_t ti; - con_lineinfo_t *li = &CON_LINES(lineno); - - //if(con.lines[lineno].mask & CON_MASK_LOADEDHISTORY) - // return 0; - - ti.fontsize = con_textsize.value; - ti.font = FONT_CONSOLE; - - return COM_Wordwrap(li->start, li->len, 0, width, Con_WordWidthFunc, &ti, Con_CountLineFunc, NULL); -} - /* ================ Con_LineHeight @@ -1672,13 +1673,19 @@ Con_LineHeight Returns the height of a given console line; calculates it if necessary. ================ */ -int Con_LineHeight(int i) +int Con_LineHeight(int lineno) { - con_lineinfo_t *li = &CON_LINES(i); - int h = li->height; - if(h != -1) - return h; - return li->height = Con_MeasureConsoleLine(i); + con_lineinfo_t *li = &CON_LINES(lineno); + if(li->height == -1) + { + float width = vid_conwidth.value; + con_text_info_t ti; + con_lineinfo_t *li = &CON_LINES(lineno); + ti.fontsize = con_textsize.value; + ti.font = FONT_CONSOLE; + li->height = COM_Wordwrap(li->start, li->len, 0, width, Con_WordWidthFunc, &ti, Con_CountLineFunc, NULL); + } + return li->height; } /* @@ -1690,14 +1697,16 @@ If alpha is 0, the line is not drawn, but still wrapped and its height returned. ================ */ -int Con_DrawConsoleLine(float y, int lineno, float ymin, float ymax) +int Con_DrawConsoleLine(int mask_must, int mask_mustnot, float y, int lineno, float ymin, float ymax) { float width = vid_conwidth.value; con_text_info_t ti; con_lineinfo_t *li = &CON_LINES(lineno); - //if(con.lines[lineno].mask & CON_MASK_LOADEDHISTORY) - // return 0; + if((li->mask & mask_must) != mask_must) + return 0; + if((li->mask & mask_mustnot) != 0) + return 0; ti.continuationString = ""; ti.alignment = 0; @@ -1720,7 +1729,7 @@ Calculates the last visible line index and how much to show of it based on con_backscroll. ================ */ -void Con_LastVisibleLine(int *last, int *limitlast) +static void Con_LastVisibleLine(int mask_must, int mask_mustnot, int *last, int *limitlast) { int lines_seen = 0; int i; @@ -1728,15 +1737,19 @@ void Con_LastVisibleLine(int *last, int *limitlast) if(con_backscroll < 0) con_backscroll = 0; + *last = 0; + // now count until we saw con_backscroll actual lines for(i = CON_LINES_COUNT - 1; i >= 0; --i) + if((CON_LINES(i).mask & mask_must) == mask_must) + if((CON_LINES(i).mask & mask_mustnot) == 0) { int h = Con_LineHeight(i); // line is the last visible line? + *last = i; if(lines_seen + h > con_backscroll && lines_seen <= con_backscroll) { - *last = i; *limitlast = lines_seen + h - con_backscroll; return; } @@ -1747,8 +1760,6 @@ void Con_LastVisibleLine(int *last, int *limitlast) // if we get here, no line was on screen - scroll so that one line is // visible then. con_backscroll = lines_seen - 1; - *last = con.lines_first; - // FIXME uses con in a non abstracted way *limitlast = 1; } @@ -1762,33 +1773,60 @@ The typing input line at the bottom should only be drawn if typing is allowed */ void Con_DrawConsole (int lines) { - int i, last, limitlast; - float y; + int mask_must = 0; + int mask_mustnot = (developer.integer>0) ? 0 : CON_MASK_DEVELOPER; + cachepic_t *conbackpic; if (lines <= 0) return; + if (con_backscroll < 0) + con_backscroll = 0; + con_vislines = lines; // draw the background - DrawQ_Pic(0, lines - vid_conheight.integer, scr_conbrightness.value >= 0.01f ? Draw_CachePic ("gfx/conback") : NULL, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, cls.signon == SIGNONS ? scr_conalpha.value : 1.0, 0); // always full alpha when not in game - DrawQ_String_Font(vid_conwidth.integer - DrawQ_TextWidth_Font(engineversion, 0, false, FONT_CONSOLE) * con_textsize.value, lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true, FONT_CONSOLE); + conbackpic = scr_conbrightness.value >= 0.01f ? Draw_CachePic("gfx/conback") : NULL; + if (conbackpic && conbackpic->tex != r_texture_notexture) + DrawQ_Pic(0, lines - vid_conheight.integer, conbackpic, vid_conwidth.integer, vid_conheight.integer, scr_conbrightness.value, scr_conbrightness.value, scr_conbrightness.value, cls.signon == SIGNONS ? scr_conalpha.value : 1.0f, 0); // always full alpha when not in game + else + DrawQ_Fill(0, lines - vid_conheight.integer, vid_conwidth.integer, vid_conheight.integer, 0.0f, 0.0f, 0.0f, cls.signon == SIGNONS ? scr_conalpha.value : 1.0f, 0); // always full alpha when not in game + DrawQ_String(vid_conwidth.integer - DrawQ_TextWidth(engineversion, 0, con_textsize.value, con_textsize.value, false, FONT_CONSOLE), lines - con_textsize.value, engineversion, 0, con_textsize.value, con_textsize.value, 1, 0, 0, 1, 0, NULL, true, FONT_CONSOLE); // draw the text +#if 0 + { + int i; + int count = CON_LINES_COUNT; + float ymax = con_vislines - 2 * con_textsize.value; + float y = ymax + con_textsize.value * con_backscroll; + for (i = 0;i < count && y >= 0;i++) + y -= Con_DrawConsoleLine(mask_must, mask_mustnot, y - con_textsize.value, CON_LINES_COUNT - 1 - i, 0, ymax) * con_textsize.value; + // fix any excessive scrollback for the next frame + if (i >= count && y >= 0) + { + con_backscroll -= (int)(y / con_textsize.value); + if (con_backscroll < 0) + con_backscroll = 0; + } + } +#else if(CON_LINES_COUNT > 0) { + int i, last, limitlast; + float y; float ymax = con_vislines - 2 * con_textsize.value; - Con_LastVisibleLine(&last, &limitlast); + Con_LastVisibleLine(mask_must, mask_mustnot, &last, &limitlast); + //Con_LastVisibleLine(mask_must, mask_mustnot, &last, &limitlast); y = ymax - con_textsize.value; if(limitlast) y += (CON_LINES(last).height - limitlast) * con_textsize.value; - // FIXME uses con in a non abstracted way i = last; for(;;) { - y -= Con_DrawConsoleLine(y, i, 0, ymax) * con_textsize.value; + y -= Con_DrawConsoleLine(mask_must, mask_mustnot, y, i, 0, ymax) * con_textsize.value; if(i == 0) break; // top of console buffer if(y < 0) @@ -1797,6 +1835,7 @@ void Con_DrawConsole (int lines) --i; } } +#endif // draw the input prompt, user text, and cursor if desired Con_DrawInput (); @@ -1872,7 +1911,7 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer lumplen = LittleLong(header->lumps[Q2LUMP_ENTITIES].filelen); } } - else if((p = LittleLong(((int *)buf)[0])) == BSPVERSION || p == 30) + else if((p = BuffLittleLong(buf)) == BSPVERSION || p == 30) { dheader_t *header = (dheader_t *)buf; lumpofs = LittleLong(header->lumps[LUMP_ENTITIES].fileofs); @@ -1911,8 +1950,8 @@ qboolean GetMapList (const char *s, char *completedname, int completednamebuffer keyname[l] = 0; if (!COM_ParseToken_Simple(&data, false, false)) break; - if (developer.integer >= 100) - Con_Printf("key: %s %s\n", keyname, com_token); + if (developer_extra.integer) + Con_DPrintf("key: %s %s\n", keyname, com_token); if (!strcmp(keyname, "message")) { // get the message contents @@ -2138,7 +2177,6 @@ int Nicks_CompleteCountPossible(char *line, int pos, char *s, qboolean isCon) { char name[128]; int i, p; - int length; int match; int spos; int count = 0; @@ -2162,7 +2200,6 @@ int Nicks_CompleteCountPossible(char *line, int pos, char *s, qboolean isCon) if(!name[0]) continue; - length = strlen(name); match = -1; spos = pos - 1; // no need for a minimum of characters :) @@ -2720,7 +2757,7 @@ void Con_CompleteCommandLine (void) a = Cmd_CompleteAliasCountPossible(s); if (a) { - Con_Printf("\n%i possible aliases%s\n", a, (a > 1) ? "s: " : ":"); + Con_Printf("\n%i possible alias%s\n", a, (a > 1) ? "es: " : ":"); Cmd_CompleteAliasPrint(s); } n = Nicks_CompleteCountPossible(key_line, key_linepos, s, true);