/*
================
-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;
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)
{
}
}
+/*
+================
+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);
+}
/*
================
dpvsnprintf(msg,sizeof(msg),fmt,argptr);
va_end(argptr);
- Con_Print(msg);
+ Con_MaskPrint(CON_MASK_PRINT, msg);
}
/*
*/
void Con_DPrint(const char *msg)
{
- if (!developer.integer)
- return; // don't confuse non-developers with techie stuff...
- Con_Print(msg);
+ Con_MaskPrint(CON_MASK_DEVELOPER, msg);
}
/*
va_list argptr;
char msg[MAX_INPUTLINE];
- if (!developer.integer)
- return; // don't confuse non-developers with techie stuff...
-
va_start(argptr,fmt);
dpvsnprintf(msg,sizeof(msg),fmt,argptr);
va_end(argptr);
- Con_Print(msg);
+ Con_MaskPrint(CON_MASK_DEVELOPER, msg);
}
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
// 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;
return ti->fontsize * ti->font->maxwidth;
}
if(maxWidth >= 0)
- return DrawQ_TextWidth_Font_UntilWidth_Size(w, ti->fontsize, ti->fontsize, length, false, ti->font, -maxWidth); // -maxWidth: we want at least one char
+ 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_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);
{
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;
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)
// 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
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;
}
/*
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;
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;
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;
}
// 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;
}
*/
void Con_DrawConsole (int lines)
{
- int i, last, limitlast;
- float y;
+ int mask_must = 0;
+ int mask_mustnot = developer.integer ? 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)
--i;
}
}
+#endif
// draw the input prompt, user text, and cursor if desired
Con_DrawInput ();
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);
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
{
char name[128];
int i, p;
- int length;
int match;
int spos;
int count = 0;
if(!name[0])
continue;
- length = strlen(name);
match = -1;
spos = pos - 1; // no need for a minimum of characters :)