2 CLASS(NexuizServerList) EXTENDS(NexuizListBox)
3 METHOD(NexuizServerList, configureNexuizServerList, void(entity))
4 ATTRIB(NexuizServerList, rowsPerItem, float, 1)
5 METHOD(NexuizServerList, draw, void(entity))
6 METHOD(NexuizServerList, drawListBoxItem, void(entity, float, vector, float))
7 METHOD(NexuizServerList, clickListBoxItem, void(entity, float, vector))
8 METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
9 METHOD(NexuizServerList, keyDown, float(entity, float, float, float))
11 ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
12 ATTRIB(NexuizServerList, realUpperMargin, float, 0)
13 ATTRIB(NexuizServerList, columnPingOrigin, float, 0)
14 ATTRIB(NexuizServerList, columnPingSize, float, 0)
15 ATTRIB(NexuizServerList, columnNameOrigin, float, 0)
16 ATTRIB(NexuizServerList, columnNameSize, float, 0)
17 ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
18 ATTRIB(NexuizServerList, columnMapSize, float, 0)
19 ATTRIB(NexuizServerList, columnTypeOrigin, float, 0)
20 ATTRIB(NexuizServerList, columnTypeSize, float, 0)
21 ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
22 ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
24 ATTRIB(NexuizServerList, selectedServer, string, string_null) // to restore selected server when needed
25 METHOD(NexuizServerList, setSelected, void(entity, float))
26 METHOD(NexuizServerList, setSortOrder, void(entity, float, float))
27 ATTRIB(NexuizServerList, filterShowEmpty, float, 1)
28 ATTRIB(NexuizServerList, filterShowFull, float, 1)
29 ATTRIB(NexuizServerList, filterString, string, string_null)
30 ATTRIB(NexuizServerList, controlledTextbox, entity, NULL)
31 ATTRIB(NexuizServerList, ipAddressBox, entity, NULL)
32 ATTRIB(NexuizServerList, favoriteButton, entity, NULL)
33 ATTRIB(NexuizServerList, nextRefreshTime, float, 0)
34 METHOD(NexuizServerList, refreshServerList, void(entity, float)) // refresh mode: 0 = just reparametrize, 1 = send new requests, 2 = clear
35 ATTRIB(NexuizServerList, needsRefresh, float, 1)
36 METHOD(NexuizServerList, focusEnter, void(entity))
37 METHOD(NexuizServerList, positionSortButton, void(entity, entity, float, float, string, void(entity, entity)))
38 ATTRIB(NexuizServerList, sortButton1, entity, NULL)
39 ATTRIB(NexuizServerList, sortButton2, entity, NULL)
40 ATTRIB(NexuizServerList, sortButton3, entity, NULL)
41 ATTRIB(NexuizServerList, sortButton4, entity, NULL)
42 ATTRIB(NexuizServerList, sortButton5, entity, NULL)
43 ATTRIB(NexuizServerList, connectButton, entity, NULL)
44 ATTRIB(NexuizServerList, infoButton, entity, NULL)
45 ATTRIB(NexuizServerList, currentSortOrder, float, 0)
46 ATTRIB(NexuizServerList, currentSortField, float, -1)
47 ATTRIB(NexuizServerList, lastClickedServer, float, -1)
48 ATTRIB(NexuizServerList, lastClickedTime, float, 0)
50 ATTRIB(NexuizServerList, ipAddressBoxFocused, float, -1)
51 ENDCLASS(NexuizServerList)
52 entity makeNexuizServerList();
53 void ServerList_Connect_Click(entity btn, entity me);
54 void ServerList_ShowEmpty_Click(entity box, entity me);
55 void ServerList_ShowFull_Click(entity box, entity me);
56 void ServerList_Filter_Change(entity box, entity me);
57 void ServerList_Favorite_Click(entity btn, entity me);
58 void ServerList_Info_Click(entity btn, entity me);
62 float SLIST_FIELD_CNAME;
63 float SLIST_FIELD_PING;
64 float SLIST_FIELD_GAME;
65 float SLIST_FIELD_MOD;
66 float SLIST_FIELD_MAP;
67 float SLIST_FIELD_NAME;
68 float SLIST_FIELD_MAXPLAYERS;
69 float SLIST_FIELD_NUMPLAYERS;
70 float SLIST_FIELD_NUMHUMANS;
71 float SLIST_FIELD_NUMBOTS;
72 float SLIST_FIELD_PROTOCOL;
73 float SLIST_FIELD_FREESLOTS;
74 float SLIST_FIELD_PLAYERS;
75 float SLIST_FIELD_QCSTATUS;
76 float SLIST_FIELD_ISFAVORITE;
77 void ServerList_UpdateFieldIDs()
79 SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
80 SLIST_FIELD_PING = gethostcacheindexforkey( "ping" );
81 SLIST_FIELD_GAME = gethostcacheindexforkey( "game" );
82 SLIST_FIELD_MOD = gethostcacheindexforkey( "mod" );
83 SLIST_FIELD_MAP = gethostcacheindexforkey( "map" );
84 SLIST_FIELD_NAME = gethostcacheindexforkey( "name" );
85 SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey( "maxplayers" );
86 SLIST_FIELD_NUMPLAYERS = gethostcacheindexforkey( "numplayers" );
87 SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
88 SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
89 SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
90 SLIST_FIELD_FREESLOTS = gethostcacheindexforkey( "freeslots" );
91 SLIST_FIELD_PLAYERS = gethostcacheindexforkey( "players" );
92 SLIST_FIELD_QCSTATUS = gethostcacheindexforkey( "qcstatus" );
93 SLIST_FIELD_ISFAVORITE = gethostcacheindexforkey( "isfavorite" );
96 float IsFavorite(string srv)
99 srv = netaddress_resolve(srv, 26000);
100 n = tokenize_console(cvar_string("net_slist_favorites"));
101 for(i = 0; i < n; ++i)
102 if(srv == netaddress_resolve(argv(i), 26000))
107 void ToggleFavorite(string srv)
109 string s, s0, s1, s2, srv_resolved;
111 srv_resolved = netaddress_resolve(srv, 26000);
112 s = cvar_string("net_slist_favorites");
113 n = tokenize_console(s);
114 for(i = 0; i < n; ++i)
115 if(srv_resolved == netaddress_resolve(argv(i), 26000))
119 s0 = substring(s, 0, argv_end_index(i - 1));
121 s2 = substring(s, argv_start_index(i + 1), -1);
122 if(s0 != "" && s2 != "")
124 print("s0 = >>", s0, "<<\ns1 = >>", s1, "<<\ns2 = >>", s2, "<<\n");
125 cvar_set("net_slist_favorites", strcat(s0, s1, s2));
132 cvar_set("net_slist_favorites", strcat(s, " ", srv));
137 entity makeNexuizServerList()
140 me = spawnNexuizServerList();
141 me.configureNexuizServerList(me);
144 void configureNexuizServerListNexuizServerList(entity me)
146 me.configureNexuizListBox(me);
148 ServerList_UpdateFieldIDs();
152 void setSelectedNexuizServerList(entity me, float i)
155 save = me.selectedItem;
156 setSelectedListBox(me, i);
158 if(me.selectedItem == save)
163 if(gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT) != me.nItems)
164 return; // sorry, it would be wrong
166 if(me.selectedServer)
167 strunzone(me.selectedServer);
168 me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
170 me.ipAddressBox.setText(me.ipAddressBox, me.selectedServer);
171 me.ipAddressBox.cursorPos = strlen(me.selectedServer);
173 void refreshServerListNexuizServerList(entity me, float mode)
175 // 0: just reparametrize
176 // 1: also ask for new servers
178 //print("refresh of type ", ftos(mode), "\n");
179 /* if(mode == 2) // borken
182 localcmd("net_slist\n");
183 me.needsRefresh = 1; // net_slist kills sort order, so we need to restore it later
188 string s, typestr, modstr;
191 m = strstrofs(s, ":", 0);
194 typestr = substring(s, 0, m);
195 s = substring(s, m + 1, strlen(s) - m - 1);
196 while(substring(s, 0, 1) == " ")
197 s = substring(s, 1, strlen(s) - 1);
202 modstr = cvar_string("menu_slist_modfilter");
204 m = SLIST_MASK_AND - 1;
205 resethostcachemasks();
206 if(!me.filterShowFull)
207 sethostcachemasknumber(++m, SLIST_FIELD_FREESLOTS, 1, SLIST_TEST_GREATEREQUAL);
208 if(!me.filterShowEmpty)
209 sethostcachemasknumber(++m, SLIST_FIELD_NUMHUMANS, 1, SLIST_TEST_GREATEREQUAL);
211 sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(typestr, ":"), SLIST_TEST_STARTSWITH);
214 if(substring(modstr, 0, 1) == "!")
215 sethostcachemaskstring(++m, SLIST_FIELD_MOD, substring(modstr, 1, strlen(modstr) - 1), SLIST_TEST_NOTEQUAL);
217 sethostcachemaskstring(++m, SLIST_FIELD_MOD, modstr, SLIST_TEST_EQUAL);
219 m = SLIST_MASK_OR - 1;
222 sethostcachemaskstring(++m, SLIST_FIELD_NAME, s, SLIST_TEST_CONTAINS);
223 sethostcachemaskstring(++m, SLIST_FIELD_MAP, s, SLIST_TEST_CONTAINS);
224 sethostcachemaskstring(++m, SLIST_FIELD_PLAYERS, s, SLIST_TEST_CONTAINS);
225 sethostcachemaskstring(++m, SLIST_FIELD_QCSTATUS, strcat(s, ":"), SLIST_TEST_STARTSWITH);
227 o = 2; // favorites first
228 if(me.currentSortOrder < 0)
229 o |= 1; // descending
230 sethostcachesort(me.currentSortField, o);
236 void focusEnterNexuizServerList(entity me)
238 if(time < me.nextRefreshTime)
240 //print("sorry, no refresh yet\n");
243 me.nextRefreshTime = time + 10;
244 me.refreshServerList(me, 1);
246 void drawNexuizServerList(entity me)
248 float i, found, owned;
250 if(me.currentSortField == -1)
252 me.setSortOrder(me, SLIST_FIELD_PING, +1);
253 me.refreshServerList(me, 2);
255 else if(me.needsRefresh == 1)
257 me.needsRefresh = 2; // delay by one frame to make sure "slist" has been executed
259 else if(me.needsRefresh == 2)
262 me.refreshServerList(me, 0);
265 owned = ((me.selectedServer == me.ipAddressBox.text) && (me.ipAddressBox.text != ""));
267 me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
269 me.connectButton.disabled = ((me.nItems == 0) && (me.ipAddressBox.text == ""));
270 me.infoButton.disabled = ((me.nItems == 0) || !owned);
273 if(me.selectedServer)
275 for(i = 0; i < me.nItems; ++i)
276 if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
278 if(i != me.selectedItem)
280 me.lastClickedServer = -1;
290 if(me.selectedItem >= me.nItems)
291 me.selectedItem = me.nItems - 1;
292 if(me.selectedServer)
293 strunzone(me.selectedServer);
294 me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
299 me.ipAddressBox.setText(me.ipAddressBox, me.selectedServer);
300 me.ipAddressBox.cursorPos = strlen(me.selectedServer);
303 if(me.ipAddressBoxFocused != me.ipAddressBox.focused)
305 me.ipAddressBoxFocused = me.ipAddressBox.focused;
306 if(me.ipAddressBoxFocused)
308 if(IsFavorite(me.ipAddressBox.text))
309 me.favoriteButton.setText(me.favoriteButton, "Remove");
311 me.favoriteButton.setText(me.favoriteButton, "Bookmark");
317 void ServerList_PingSort_Click(entity btn, entity me)
319 me.setSortOrder(me, SLIST_FIELD_PING, +1);
321 void ServerList_NameSort_Click(entity btn, entity me)
323 me.setSortOrder(me, SLIST_FIELD_NAME, -1); // why?
325 void ServerList_MapSort_Click(entity btn, entity me)
327 me.setSortOrder(me, SLIST_FIELD_MAP, -1); // why?
329 void ServerList_PlayerSort_Click(entity btn, entity me)
331 me.setSortOrder(me, SLIST_FIELD_NUMHUMANS, -1);
333 void ServerList_TypeSort_Click(entity btn, entity me)
338 m = strstrofs(s, ":", 0);
341 s = substring(s, 0, m);
342 while(substring(s, m+1, 1) == " ") // skip spaces
348 for(i = 1; ; ++i) // 20 modes ought to be enough for anyone
350 t = GametypeNameFromType(i);
352 if(t == GametypeNameFromType(0)) // it repeats (default case)
355 // choose the first one
359 if(s == GametypeNameFromType(i))
361 // the type was found
362 // choose the next one
363 s = GametypeNameFromType(i + 1);
364 if(s == GametypeNameFromType(0))
372 s = strcat(s, substring(me.filterString, m+1, strlen(me.filterString) - m - 1));
374 me.controlledTextbox.setText(me.controlledTextbox, s);
375 me.controlledTextbox.keyDown(me.controlledTextbox, K_END, 0, 0);
376 me.controlledTextbox.keyUp(me.controlledTextbox, K_END, 0, 0);
377 //ServerList_Filter_Change(me.controlledTextbox, me);
379 void ServerList_Filter_Change(entity box, entity me)
382 strunzone(me.filterString);
384 me.filterString = strzone(box.text);
386 me.filterString = string_null;
387 me.refreshServerList(me, 0);
389 me.ipAddressBox.setText(me.ipAddressBox, "");
390 me.ipAddressBox.cursorPos = 0;
392 void ServerList_ShowEmpty_Click(entity box, entity me)
394 box.setChecked(box, me.filterShowEmpty = !me.filterShowEmpty);
395 me.refreshServerList(me, 0);
397 me.ipAddressBox.setText(me.ipAddressBox, "");
398 me.ipAddressBox.cursorPos = 0;
400 void ServerList_ShowFull_Click(entity box, entity me)
402 box.setChecked(box, me.filterShowFull = !me.filterShowFull);
403 me.refreshServerList(me, 0);
405 me.ipAddressBox.setText(me.ipAddressBox, "");
406 me.ipAddressBox.cursorPos = 0;
408 void setSortOrderNexuizServerList(entity me, float field, float direction)
410 if(me.currentSortField == field)
411 direction = -me.currentSortOrder;
412 me.currentSortOrder = direction;
413 me.currentSortField = field;
414 me.sortButton1.forcePressed = (field == SLIST_FIELD_PING);
415 me.sortButton2.forcePressed = (field == SLIST_FIELD_NAME);
416 me.sortButton3.forcePressed = (field == SLIST_FIELD_MAP);
417 me.sortButton4.forcePressed = 0;
418 me.sortButton5.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
420 if(me.selectedServer)
421 strunzone(me.selectedServer);
422 me.selectedServer = string_null;
423 me.refreshServerList(me, 0);
425 void positionSortButtonNexuizServerList(entity me, entity btn, float theOrigin, float theSize, string theTitle, void(entity, entity) theFunc)
427 vector originInLBSpace, sizeInLBSpace;
428 originInLBSpace = eY * (-me.itemHeight);
429 sizeInLBSpace = eY * me.itemHeight + eX * (1 - me.controlWidth);
431 vector originInDialogSpace, sizeInDialogSpace;
432 originInDialogSpace = boxToGlobal(originInLBSpace, me.Container_origin, me.Container_size);
433 sizeInDialogSpace = boxToGlobalSize(sizeInLBSpace, me.Container_size);
435 btn.Container_origin_x = originInDialogSpace_x + sizeInDialogSpace_x * theOrigin;
436 btn.Container_size_x = sizeInDialogSpace_x * theSize;
437 btn.setText(btn, theTitle);
438 btn.onClick = theFunc;
439 btn.onClickEntity = me;
442 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
444 resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
446 me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
447 me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
448 me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
450 me.columnPingOrigin = 0;
451 me.columnPingSize = me.realFontSize_x * 4;
452 me.columnMapSize = me.realFontSize_x * 12;
453 me.columnTypeSize = me.realFontSize_x * 4;
454 me.columnPlayersSize = me.realFontSize_x * 6;
455 me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - me.columnTypeSize - 4 * me.realFontSize_x;
456 me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
457 me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
458 me.columnTypeOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
459 me.columnPlayersOrigin = me.columnTypeOrigin + me.columnTypeSize + me.realFontSize_x;
461 me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, "Ping", ServerList_PingSort_Click);
462 me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, "Host name", ServerList_NameSort_Click);
463 me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, "Map", ServerList_MapSort_Click);
464 me.positionSortButton(me, me.sortButton4, me.columnTypeOrigin, me.columnTypeSize, "Type", ServerList_TypeSort_Click);
465 me.positionSortButton(me, me.sortButton5, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
468 f = me.currentSortField;
471 me.currentSortField = -1;
472 me.setSortOrder(me, f, me.currentSortOrder); // force resetting the sort order
475 void ServerList_Connect_Click(entity btn, entity me)
477 if(me.ipAddressBox.text == "")
478 localcmd("connect ", me.selectedServer, "\n");
480 localcmd("connect ", me.ipAddressBox.text, "\n");
482 void ServerList_Favorite_Click(entity btn, entity me)
485 ipstr = netaddress_resolve(me.ipAddressBox.text, 26000);
488 ToggleFavorite(me.ipAddressBox.text);
489 me.ipAddressBoxFocused = -1;
492 void ServerList_Info_Click(entity btn, entity me)
494 main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
495 DialogOpenButton_Click(me, main.serverInfoDialog);
497 void clickListBoxItemNexuizServerList(entity me, float i, vector where)
499 if(i == me.lastClickedServer)
500 if(time < me.lastClickedTime + 0.3)
503 ServerList_Connect_Click(NULL, me);
505 me.lastClickedServer = i;
506 me.lastClickedTime = time;
508 void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
510 // layout: Ping, Server name, Map name, NP, TP, MP
517 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
519 if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
520 theAlpha = SKINALPHA_SERVERLIST_FULL;
521 else if not(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
522 theAlpha = SKINALPHA_SERVERLIST_EMPTY;
526 p = gethostcachenumber(SLIST_FIELD_PING, i);
529 #define PING_HIGH 500
531 theColor = SKINCOLOR_SERVERLIST_LOWPING + (SKINCOLOR_SERVERLIST_MEDPING - SKINCOLOR_SERVERLIST_LOWPING) * (p / PING_LOW);
532 else if(p < PING_MED)
533 theColor = SKINCOLOR_SERVERLIST_MEDPING + (SKINCOLOR_SERVERLIST_HIGHPING - SKINCOLOR_SERVERLIST_MEDPING) * ((p - PING_LOW) / (PING_MED - PING_LOW));
534 else if(p < PING_HIGH)
536 theColor = SKINCOLOR_SERVERLIST_HIGHPING;
537 theAlpha *= 1 + (SKINALPHA_SERVERLIST_HIGHPING - 1) * ((p - PING_MED) / (PING_HIGH - PING_MED));
542 theAlpha *= SKINALPHA_SERVERLIST_HIGHPING;
545 if(gethostcachenumber(SLIST_FIELD_ISFAVORITE, i))
547 theColor = theColor * (1 - SKINALPHA_SERVERLIST_FAVORITE) + SKINCOLOR_SERVERLIST_FAVORITE * SKINALPHA_SERVERLIST_FAVORITE;
548 theAlpha = theAlpha * (1 - SKINALPHA_SERVERLIST_FAVORITE) + SKINALPHA_SERVERLIST_FAVORITE;
552 draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s, 0) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha, 0);
553 s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x, 0);
554 draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha, 0);
555 s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x, 0);
556 draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
557 s = gethostcachestring(SLIST_FIELD_QCSTATUS, i);
558 p = strstrofs(s, ":", 0);
560 s = substring(s, 0, p);
563 s = draw_TextShortenToWidth(s, me.columnMapSize / me.realFontSize_x, 0);
564 draw_Text(me.realUpperMargin * eY + (me.columnTypeOrigin + (me.columnTypeSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
565 s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
566 draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s, 0) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha, 0);
569 float keyDownNexuizServerList(entity me, float scan, float ascii, float shift)
574 org = boxToGlobal(eY * (me.selectedItem * me.itemHeight - me.scrollPos), me.origin, me.size);
575 sz = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), me.size);
579 ServerList_Connect_Click(NULL, me);
582 else if(scan == K_MOUSE2 || scan == K_SPACE)
584 main.serverInfoDialog.loadServerInfo(main.serverInfoDialog, me.selectedItem);
585 DialogOpenButton_Click_withCoords(me, main.serverInfoDialog, org, sz);
587 else if(scan == K_INS || scan == K_MOUSE3)
592 ToggleFavorite(me.selectedServer);
593 me.ipAddressBoxFocused = -1;
596 else if(keyDownListBox(me, scan, ascii, shift))
598 else if(!me.controlledTextbox)
601 return me.controlledTextbox.keyDown(me.controlledTextbox, scan, ascii, shift);