void metawindow() /* Show the meta server menu window */ { int i, height; char *header; static int lastHeight = 0; if (!metaWin) { height = 250 + metaHeight * (W_Textheight + 8) + 4 * (metaHeight - 1); metaWin = W_MakeWindow("Netrek Server List", 0, 0, 716, height, NULL, 2, foreColor); W_SetBackgroundImage(metaWin, "Misc/map_back.png"); logo = W_ReadImage(metaWin, "netrek-green-white-300px.png"); metaList = W_MakeMenu("metalist", 50, 200, LINE, metaHeight, metaWin, 1); lastHeight = metaHeight; make_help(); } else { if (metaHeight > lastHeight) { W_ReinitMenu(metaList, LINE, metaHeight); W_ResizeMenu(metaList, LINE, metaHeight); lastHeight = metaHeight; } // FIXME: handle metaList growing beyond metaWin } header = "Server Status Type Age"; W_WriteText(metaList, 0, 0, W_Cyan, header, -1, 0); for (i = 0; i < metaHeight; i++) redraw(i); /* Give the window the right name */ W_RenameWindow(metaWin, metaWindowName); /* Add additional options */ W_WriteText(metaList, 0, metaHeight-B_REFRESH, W_Yellow, "Refresh (r)", -1, 0); add_redraw(); W_WriteText(metaList, 0, metaHeight-B_HELP, W_Yellow, "Help & Tips (h)", -1, 0); W_WriteText(metaList, 0, metaHeight-B_QUIT, W_Yellow, "Quit (q)", -1, 0); /* Map window */ W_MapWindow(metaList); W_MapWindow(metaWin); }
static void make_help() { int i, l, h, w; /* calculate width and height required */ h = (sizeof(metahelp_message)/sizeof(char *)); w = 0; for (i=0; i<h; i++) { char *line = metahelp_message[i]; if (line == NULL) break; l = strlen(line); if (l > w) w = l; } metaHelpWin = W_MakeWindow("Netrek Server List - Help", 500, 500, w * W_Textwidth + 40, h * W_Textheight + 40, 0, 2, foreColor); }
void newwin(char *hostmon, char *progname) { int i; W_Image *image; /* W_Initialize(hostmon); */ getResources(progname); /* the x,y passwd to makewindow are the x,y of the top left corner of the border. The actual window starts x+BORDER,y+BORDER down. The given width is the width of the window WITHOUT the border, ie. useable space. [BDyess] */ baseWin = W_MakeWindow("netrek", 0, YOFF, WINSIDE + MAPSIDE + 6 * BORDER, WINSIDE + 9 * BORDER + 2 * MESSAGESIZE + 23 * W_Textheight + 2*WIN_EDGE, NULL, "bomb here", /*no border*/ 0, gColor); image = getImage(I_ICON); iconWin = W_MakeWindow("netrek_icon", 0, 0, image->width,image->height,NULL, (char *) 0, BORDER, gColor); W_SetIconWindow(baseWin, iconWin); w = W_MakeWindow("local", BORDER, BORDER, WINSIDE, WINSIDE, baseWin, (char *) 0, BORDER, foreColor); mapw = W_MakeWindow("map", WINSIDE + 3*BORDER, BORDER, MAPSIDE, MAPSIDE, baseWin, (char *) 0, BORDER, foreColor); tstatw = W_MakeWindow("tstat", BORDER, winside+3*BORDER, winside, STATSIZE, baseWin, "xterm", BORDER, foreColor); /* if(xpm) W_SetWindowBackgroundImage(tstatw, getImage(I_DASHBOARD_BG));*/ warnw = W_MakeWindow("warn", winside+3*BORDER, mapside+3*BORDER, mapside, MESSAGESIZE, baseWin, "xterm", BORDER, foreColor); messagew = W_MakeWindow("message", winside+3*BORDER, mapside + 5*BORDER + MESSAGESIZE, mapside, MESSAGESIZE, baseWin, "xterm", BORDER, foreColor); planetw = W_MakeTextWindow("planet", 10, 10, 75, (MAXPLANETS + 16) / 2, w, (char *) 0, 2); planetw2 = W_MakeTextWindow("planet2", 10, 10, 75, (MAXPLANETS + 16) / 2, mapw, (char *) 0, 2); rankw = W_MakeTextWindow("rank", 50, 100, 65, nranks2 + 8, w, (char*) 0, 2); playerw = W_MakeTextWindow("Player", winside + 3*BORDER, mapside + 7 * BORDER + 2 * MESSAGESIZE, (mapside-2*WIN_EDGE)/W_Textwidth/*82*/, 23, baseWin, (char *) 0, 2); helpWin = W_MakeTextWindow("HELP!", 0, YOFF + winside + 2 * BORDER + 2 * MESSAGESIZE, 160, helpmessages / 4 + 1, NULL, (char *) 0, BORDER); initMessageWindows(); pStats = W_MakeWindow("Network Statistics", 500, 4, pStatsWidth(), pStatsHeight(), NULL, (char *) 0, 1, foreColor); udpWin = W_MakeMenu("UDP", winside + 10, -BORDER + 10, 40, UDP_NUMOPTS, NULL, 2); spWin = W_MakeMenu("network", winside + 10, -BORDER + 10, 40, SPK_NUMFIELDS, NULL, 2); toolsWin = W_MakeScrollingWindow("tools", winside + BORDER, BORDER, 80, TOOLSWINLEN, NULL, "xterm", BORDER); motdWin = W_MakeWindow("Motd" ,-BORDER, -BORDER, winside, winside, NULL, (char *) 0, BORDER, foreColor); for (i = 0; i < 4; i++) { teamWin[i] = W_MakeWindow(teaminfo[i].shortname, i * (BOXSIDE+2*BORDER), 0, BOXSIDE, BOXSIDE, mapw, (char *) 0, BORDER, foreColor); } qwin = W_MakeWindow("quit", 4 * (BOXSIDE+2*BORDER), 0, BOXSIDE, BOXSIDE, mapw, "pirate", BORDER, foreColor); /* statwin = W_MakeWindow("Stats", 422, 13, 160, 95, NULL, (char*)0, 5, foreColor);*/ statwin = W_MakeWindow("stats", 422, 13, 160, 80, NULL, (char *) 0, 5, foreColor); newstatwin = W_MakeWindow("NewStats", 422, 13, 100 + 2*BORDER, 400+2*BORDER, NULL, (char *) 0, BORDER, foreColor); #define WARHEIGHT 2 #define WARWIDTH 20 #define WARBORDER BORDER war = W_MakeMenu("war", winside + 10, 10, WARWIDTH, 6, baseWin, WARBORDER); /* needed to update constants now that local and map window sizes are dynamic [BDyess] */ recalcWindowConstants(); saveimages(); }
findslot(void) { int oldcount = -1; W_Window waitWin, qwin, countWin, motdButtonWin; W_Window motdWin; extern int MaxMotdLine; int WaitMotdLine = 0; int mapMotd = booleanDefault("showMotd", 1); W_Event event; /* Wait for some kind of indication about in/not in */ while (queuePos == -1) { socketPause(); if (isServerDead()) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("Shit! Ghostbusted!\n"); terminate(0); } readFromServer(NULL); if (me != NULL) { /* We are in! */ ANNOUNCESOCKET; return (me->p_no); } } /* We have to wait. Make appropriate windows, etc... */ waitWin = W_MakeWindow("wait", 0, 0, WAITWIDTH, WAITHEIGHT, NULL, 2, foreColor); countWin = W_MakeWindow("count", WAITWIDTH / 3, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); qwin = W_MakeWindow("waitquit", 0, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); motdButtonWin = W_MakeWindow("motdbutton", 2 * WAITWIDTH / 3, WAITTITLE, WAITWIDTH / 3, WAITHEIGHT - WAITTITLE, waitWin, 1, foreColor); W_MapWindow(waitWin); W_MapWindow(countWin); W_MapWindow(motdButtonWin); W_MapWindow(qwin); if (mapMotd) { motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(motdWin); showMotd(motdWin, WaitMotdLine); } for (;;) { socketPause(); readFromServer(NULL); if (isServerDead()) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("Damn, We've been ghostbusted!\n"); terminate(0); } while (W_EventsPending()) { W_NextEvent(&event); switch ((int) event.type) { case W_EV_BUTTON: case W_EV_KEY: if (mapMotd && event.Window == motdWin) { if (event.key == ' ' || event.key == 'q') { W_DestroyWindow(motdWin); mapMotd = !mapMotd; } else { if (event.key == 'b') { WaitMotdLine -= 28; WaitMotdLine = MAX(WaitMotdLine, 0); } else { WaitMotdLine += 28; /* scroll to start if it goes over */ if (WaitMotdLine > MaxMotdLine) WaitMotdLine = 0; } W_ClearWindow(motdWin); showMotd(motdWin, WaitMotdLine); break; } } else if (event.Window == motdButtonWin) { if (mapMotd) { W_DestroyWindow(motdWin); } else { motdWin = W_MakeWindow("waitmotd", 1, WAITWIDTH + 1, TWINSIDE, TWINSIDE, 0, 2, foreColor); W_MapWindow(motdWin); showMotd(motdWin, WaitMotdLine); } mapMotd = !mapMotd; } else if (event.Window == qwin) { #if defined(SOUND) && !defined(HAVE_SDL) Exit_Sound(); #endif printf("OK, bye!\n"); terminate(0); } break; case W_EV_EXPOSE: if (event.Window == waitWin) { mapWaitWin(waitWin); } else if (event.Window == motdWin) { showMotd(motdWin, WaitMotdLine); } else if (event.Window == qwin) { mapWaitQuit(qwin); } else if (event.Window == countWin) { mapWaitCount(waitWin, countWin, queuePos); } else if (event.Window == motdButtonWin) { mapWaitMotdButton(motdButtonWin); } break; default: break; } } if (queuePos != oldcount) { mapWaitCount(waitWin, countWin, queuePos); oldcount = queuePos; } if (me != NULL) { W_DestroyWindow(waitWin); if (mapMotd) { W_DestroyWindow(motdWin); } ANNOUNCESOCKET; W_Beep(); W_Beep(); return (me->p_no); } } }
showdocs(int atline) { FILE *fptr; int i, length, top, center; struct list *data; int count; char buf[128]; W_Font font; if (!docwin) docwin = W_MakeWindow("DocWin", 0, 181, 500, 500, 0, 2, foreColor); W_ClearWindow(docwin); if (!W_IsMapped(docwin)) W_MapWindow(docwin); sprintf(buf, "--- %s ---", (char *) query_cowid()); length = strlen(buf); /* using GWINSIDE instead of TWINSIDE because with SMALL_SCREEN defined it * * makes more sense to use the smaller width in the interest of saving * * screen real estate */ center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(docwin, center, W_Textheight, textColor, buf, length, W_BoldFont); sprintf(buf, cbugs); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(docwin, center, 3 * W_Textheight, textColor, buf, length, W_RegularFont); if (!docdata) loaddocs(); top = 10; if (atline > maxdoclines) atline = maxdoclines - 28; data = docdata; for (i = 0; i < atline; i++) { if (data == NULL) { atline = 0; data = docdata; break; } data = data->next; } count = 28; /* Magical # of lines to * * * display */ for (i = top; i < 50; i++) { if (data == NULL) break; if (data->data == NULL) continue; switch (data->face) { case BOLD: font = W_BoldFont; break; case ITALIC: font = W_UnderlineFont; break; case NORMAL: font = W_RegularFont; break; } W_WriteText(docwin, 20, i * W_Textheight, textColor, data->data, strlen(data->data), font); data = data->next; count--; if (count <= 0) break; } }
showxtrekrc(int atline) { FILE *fptr; int i, length, top, center; struct list *data; int count; char buf[128]; W_Font font; if (!xtrekrcwin) xtrekrcwin = W_MakeWindow("xtrekrcWin", 0, 200, 500, 500, 0, 2, foreColor); W_ClearWindow(xtrekrcwin); if (!W_IsMapped(xtrekrcwin)) W_MapWindow(xtrekrcwin); sprintf(buf, "--- %s ---", (char *) query_cowid()); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(xtrekrcwin, center, W_Textheight, textColor, buf, length, W_BoldFont); sprintf(buf, cbugs); length = strlen(buf); center = GWINSIDE / 2 - (length * W_Textwidth) / 2; W_WriteText(xtrekrcwin, center, 3 * W_Textheight, textColor, buf, length, W_RegularFont); if (!xtrekrcdata) loadxtrekrc(); top = 10; if (atline > maxxtrekrclines) atline = maxxtrekrclines - 28; data = xtrekrcdata; for (i = 0; i < atline; i++) { if (data == NULL) { atline = 0; data = xtrekrcdata; break; } data = data->next; } count = 28; /* Magical # of lines to * * * display */ for (i = top; i < 50; i++) { if (data == NULL) break; if (data->data == NULL) continue; switch (data->face) { case BOLD: font = W_BoldFont; break; case ITALIC: font = W_UnderlineFont; break; case NORMAL: font = W_RegularFont; break; } W_WriteText(xtrekrcwin, 20, i * W_Textheight, textColor, data->data, strlen(data->data), font); data = data->next; count--; if (count <= 0) break; } }