truelight@0: #include "stdafx.h" truelight@0: #include "ttd.h" truelight@0: #include "window.h" truelight@0: #include "gui.h" truelight@0: #include "gfx.h" truelight@0: #include "command.h" darkvater@211: #include "network.h" truelight@0: truelight@0: #define BGC 5 truelight@0: #define BTC 15 truelight@0: #define MAX_QUERYSTR_LEN 64 truelight@0: static byte _edit_str_buf[MAX_QUERYSTR_LEN*2]; truelight@0: static void ShowNetworkStartServerWindow(); darkvater@175: #if 0 truelight@0: static void ShowNetworkLobbyWindow(); darkvater@175: #endif truelight@0: truelight@0: static byte _selected_field; truelight@0: truelight@0: static const StringID _connection_types_dropdown[] = { truelight@0: STR_NETWORK_LAN, truelight@0: STR_NETWORK_INTERNET, truelight@0: INVALID_STRING_ID truelight@0: }; truelight@0: darkvater@172: /* Should be _network_game->players_max but since network is not yet really done truelight@193: * we'll just use some dummy here darkvater@172: * network.c -->> static NetworkGameInfo _network_game; darkvater@172: */ darkvater@172: static byte _players_max; darkvater@172: /* Should be ??????????? (something) but since network is not yet really done truelight@193: * we'll just use some dummy here darkvater@172: */ darkvater@172: static byte _network_connection; signde@206: static uint16 _network_game_count_last; darkvater@172: darkvater@211: enum { darkvater@211: NET_PRC__OFFSET_TOP_WIDGET = 93, darkvater@211: NET_PRC__SIZE_OF_ROW = 14, darkvater@211: }; darkvater@211: darkvater@211: static NetworkGameList *selected_item = NULL; darkvater@211: truelight@0: static void NetworkGameWindowWndProc(Window *w, WindowEvent *e) truelight@0: { truelight@0: switch(e->event) { truelight@0: case WE_PAINT: { truelight@193: truelight@0: SET_DPARAM16(0, 0x00); darkvater@172: SET_DPARAM16(2, STR_NETWORK_LAN + _network_connection); truelight@0: DrawWindowWidgets(w); truelight@193: truelight@0: DrawEditBox(w, 6); truelight@193: truelight@0: DrawString(9, 43, STR_NETWORK_PLAYER_NAME, 2); truelight@0: DrawString(9, 63, STR_NETWORK_SELECT_CONNECTION, 2); truelight@0: truelight@0: DrawString(15, 82, STR_NETWORK_GAME_NAME, 2); truelight@0: DrawString(238, 82, STR_NETWORK_PLAYERS, 2); truelight@0: DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2); truelight@193: darkvater@211: { // draw list of games darkvater@211: uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3; darkvater@211: int32 n = 0; darkvater@211: NetworkGameList *cur_item = _network_game_list; darkvater@211: while (cur_item != NULL) { darkvater@211: if (cur_item == selected_item) darkvater@211: GfxFillRect(11, y - 2, 380, y + 9, 10); // show highlighted item with a different colour darkvater@211: darkvater@211: DoDrawString(cur_item->item.server_name, 15, y, 16); // server name darkvater@211: darkvater@211: SET_DPARAM8(0, cur_item->item.players_on); darkvater@211: SET_DPARAM8(1, cur_item->item.players_max); darkvater@211: DrawString(238, y, STR_NETWORK_PLAYERS_VAL, 2); // #/# darkvater@211: darkvater@211: DoDrawString(cur_item->item.map_name, 288, y, 16); // map size darkvater@211: cur_item = cur_item->_next; darkvater@211: y += NET_PRC__SIZE_OF_ROW; darkvater@211: if (++n == w->vscroll.cap) { break;} // max number of games in the window darkvater@211: } darkvater@211: } darkvater@172: } break; truelight@0: truelight@0: case WE_CLICK: truelight@0: _selected_field = e->click.widget; truelight@0: switch(e->click.widget) { darkvater@172: case 0: case 15: /* Close 'X' | Cancel button */ truelight@0: DeleteWindowById(WC_NETWORK_WINDOW, 0); dominik@105: NetworkLobbyShutdown(); truelight@0: break; darkvater@172: case 3: { /* Find server automaticaly */ darkvater@175: NetworkCoreConnectGame("auto", _network_server_port); darkvater@172: } break; darkvater@172: case 4: { /* Connect via direct ip */ truelight@0: StringID str; truelight@0: str = AllocateName((byte*)_decode_parameters, 0); truelight@193: truelight@0: ShowQueryString( truelight@0: str, truelight@0: STR_NETWORK_ENTER_IP, darkvater@213: 50, // maximum 50 characters OR darkvater@213: 250, // characters up to width 250 pixels, whichever is satisfied first truelight@0: w->window_class, truelight@0: w->window_number); truelight@0: DeleteName(str); darkvater@172: } break; darkvater@172: case 5: /* Start server */ truelight@0: ShowNetworkStartServerWindow(); truelight@0: break; darkvater@172: case 7: case 8: /* Connection type */ darkvater@172: ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8 truelight@0: return; darkvater@211: case 14: { /* Matrix to show networkgames */ darkvater@211: uint32 id_v = (e->click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW; darkvater@211: darkvater@211: if (id_v >= w->vscroll.cap) { return;} // click out of bounds darkvater@211: darkvater@211: id_v += w->vscroll.pos; darkvater@211: darkvater@211: { darkvater@211: NetworkGameList *cur_item = _network_game_list; darkvater@216: for (; id_v > 0 && cur_item != NULL; id_v--) darkvater@211: cur_item = cur_item->_next; darkvater@211: darkvater@211: if (cur_item == NULL) { return;} // click out of vehicle bounds darkvater@211: darkvater@211: selected_item = cur_item; darkvater@211: } darkvater@211: } break; darkvater@211: case 16: /* Join Game */ darkvater@211: if (selected_item != NULL) darkvater@211: NetworkCoreConnectGameStruct(selected_item); darkvater@211: break; truelight@0: } darkvater@172: break; darkvater@172: darkvater@172: case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */ darkvater@172: _network_connection = e->dropdown.index; signde@206: switch (_network_connection) { darkvater@211: case 0: /* LAN */ signde@206: NetworkGameListFromLAN(); signde@206: break; darkvater@211: case 1: /* Internet */ signde@206: NetworkGameListFromInternet(); signde@206: break; signde@206: } darkvater@222: darkvater@211: _network_game_count_last = _network_game_count; darkvater@211: SetWindowDirty(w); darkvater@211: darkvater@172: break; truelight@0: truelight@0: case WE_MOUSELOOP: darkvater@172: if (_selected_field == 6) darkvater@172: HandleEditBox(w, 6); truelight@193: truelight@0: break; truelight@0: truelight@0: case WE_KEYPRESS: darkvater@175: if (_selected_field != 6) truelight@0: break; darkvater@172: truelight@0: switch (HandleEditBoxKey(w, 6, e)) { truelight@0: case 1: truelight@0: HandleButtonClick(w, 9); truelight@0: break; truelight@0: } truelight@0: break; truelight@0: truelight@0: case WE_ON_EDIT_TEXT: { signde@214: byte *b = e->edittext.str; signde@214: if (*b != 0) { darkvater@228: const byte *port = NULL; darkvater@228: const byte *player = NULL; signde@214: uint16 rport; signde@214: signde@214: rport = _network_server_port; darkvater@222: darkvater@228: ParseConnectionString(&player, &port, b); signde@214: signde@214: if (player!=NULL) _network_playas = atoi(player); signde@214: if (port!=NULL) rport = atoi(port); signde@214: signde@214: NetworkCoreConnectGame(b, rport); signde@214: } darkvater@211: } break; darkvater@211: darkvater@211: case WE_TICK: { darkvater@211: if (_network_game_count_last != _network_game_count) darkvater@211: SetWindowDirty(w); truelight@0: } break; truelight@0: truelight@0: } truelight@0: } truelight@0: truelight@0: static const Widget _network_game_window_widgets[] = { darkvater@211: { WWT_CLOSEBOX, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, darkvater@172: { WWT_CAPTION, BGC, 10, 399, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL}, darkvater@172: { WWT_IMGBTN, BGC, 0, 399, 14, 199, 0x0, STR_NULL}, truelight@0: darkvater@172: { WWT_PUSHTXTBTN, BTC, 20, 130, 22, 33, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, darkvater@172: { WWT_PUSHTXTBTN, BTC, 145, 255, 22, 33, STR_NETWORK_DIRECT_CONNECT, STR_NETWORK_DIRECT_CONNECT_TIP}, darkvater@172: { WWT_PUSHTXTBTN, BTC, 270, 380, 22, 33, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, truelight@0: darkvater@172: { WWT_IMGBTN, BGC, 250, 394, 42, 53, 0x0, STR_NETWORK_ENTER_NAME_TIP}, truelight@0: darkvater@172: { WWT_6, BGC, 250, 393, 62, 73, STR_NETWORK_COMBO1, STR_NETWORK_CONNECTION_TYPE_TIP}, darkvater@172: { WWT_CLOSEBOX, BGC, 382, 392, 63, 72, STR_0225, STR_NETWORK_CONNECTION_TYPE_TIP}, truelight@0: darkvater@211: { WWT_SCROLLBAR, BGC, 382, 392, 81, 176, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, truelight@0: darkvater@172: { WWT_IMGBTN, BTC, 10, 231, 81, 92, 0x0, STR_NETWORK_GAME_NAME_TIP }, darkvater@172: { WWT_IMGBTN, BTC, 232, 281, 81, 92, 0x0, STR_NETWORK_PLAYERS_TIP }, darkvater@172: { WWT_IMGBTN, BTC, 282, 331, 81, 92, 0x0, STR_NETWORK_MAP_SIZE_TIP }, darkvater@172: { WWT_IMGBTN, BTC, 332, 381, 81, 92, 0x0, STR_NETWORK_INFO_ICONS_TIP }, darkvater@172: darkvater@211: { WWT_MATRIX, BGC, 10, 381, 93, 176, 0x601, STR_NETWORK_CLICK_GAME_TO_SELECT}, darkvater@172: darkvater@172: { WWT_PUSHTXTBTN, BTC, 145, 255, 180, 191, STR_012E_CANCEL, STR_NULL}, darkvater@172: { WWT_PUSHTXTBTN, BTC, 270, 392, 180, 191, STR_NETWORK_JOIN_GAME, STR_NULL}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _network_game_window_desc = { truelight@0: WDP_CENTER, WDP_CENTER, 400, 200, truelight@0: WC_NETWORK_WINDOW,0, truelight@0: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, truelight@0: _network_game_window_widgets, truelight@0: NetworkGameWindowWndProc, truelight@0: }; truelight@0: truelight@0: truelight@0: void ShowNetworkGameWindow() truelight@0: { truelight@0: Window *w; truelight@0: DeleteWindowById(WC_NETWORK_WINDOW, 0); dominik@105: dominik@105: NetworkLobbyInit(); truelight@193: truelight@0: w = AllocateWindowDesc(&_network_game_window_desc); truelight@0: strcpy(_edit_str_buf, "Your name"); darkvater@211: w->vscroll.cap = 6; darkvater@211: w->disabled_state = (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working darkvater@211: NetworkGameListFromLAN(); // default dropdown item is LAN, so fill that array truelight@0: signde@206: _network_game_count_last = _network_game_count; truelight@193: truelight@0: WP(w,querystr_d).caret = 1; truelight@0: WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; truelight@0: WP(w,querystr_d).maxwidth = 240; truelight@0: WP(w,querystr_d).buf = _edit_str_buf; truelight@0: } truelight@0: truelight@0: static const StringID _players_dropdown[] = { truelight@0: STR_NETWORK_2_PLAYERS, truelight@0: STR_NETWORK_3_PLAYERS, truelight@0: STR_NETWORK_4_PLAYERS, truelight@0: STR_NETWORK_5_PLAYERS, truelight@0: STR_NETWORK_6_PLAYERS, truelight@0: STR_NETWORK_7_PLAYERS, truelight@0: STR_NETWORK_8_PLAYERS, truelight@0: INVALID_STRING_ID truelight@0: }; truelight@0: truelight@0: static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e) truelight@0: { truelight@0: switch(e->event) { truelight@0: case WE_PAINT: { truelight@193: darkvater@172: SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _players_max); truelight@0: DrawWindowWidgets(w); truelight@0: truelight@0: GfxFillRect(11, 63, 237, 168, 0xD7); truelight@0: truelight@0: DrawEditBox(w, 3); truelight@0: DrawEditBox(w, 4); truelight@193: truelight@0: DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2); truelight@0: DrawString(210, 22, STR_NETWORK_PASSWORD, 2); truelight@0: truelight@0: DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2); truelight@0: DrawString(260, 63, STR_NETWORK_NUMBER_OF_PLAYERS, 2); truelight@193: darkvater@172: } break; truelight@0: truelight@0: case WE_CLICK: truelight@0: _selected_field = e->click.widget; truelight@0: switch(e->click.widget) { darkvater@172: case 0: case 12: /* Close 'X' | Cancel button */ truelight@0: ShowNetworkGameWindow(); truelight@0: break; darkvater@172: case 7: case 8: /* Number of Players */ darkvater@172: ShowDropDownMenu(w, _players_dropdown, _players_max, 8, 0); // do it for widget 8 truelight@0: return; darkvater@172: case 9: /* Start game */ dominik@105: NetworkCoreStartGame(); darkvater@211: strcpy(_network_game.server_name, WP(w,querystr_d).buf); darkvater@172: //ShowNetworkLobbyWindow(); dominik@105: DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME); truelight@0: break; darkvater@172: case 10: /* Load game */ darkvater@172: NetworkCoreStartGame(); darkvater@211: strcpy(_network_game.server_name, WP(w,querystr_d).buf); darkvater@172: //ShowNetworkLobbyWindow(); darkvater@172: ShowSaveLoadDialog(SLD_LOAD_GAME); darkvater@172: break; darkvater@172: case 11: /* Load scenario */ darkvater@172: NetworkCoreStartGame(); darkvater@211: strcpy(_network_game.server_name, WP(w,querystr_d).buf); darkvater@172: //ShowNetworkLobbyWindow(); darkvater@211: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); darkvater@172: break; truelight@0: } darkvater@172: break; darkvater@172: darkvater@172: case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */ darkvater@172: _players_max = e->dropdown.index; darkvater@172: darkvater@172: SetWindowDirty(w); darkvater@172: break; truelight@0: truelight@0: case WE_MOUSELOOP: darkvater@172: if(_selected_field == 3 || _selected_field == 4) darkvater@172: HandleEditBox(w, _selected_field); darkvater@172: truelight@0: break; truelight@0: truelight@0: case WE_KEYPRESS: truelight@0: if(_selected_field != 3 && _selected_field != 4) truelight@0: break; truelight@0: switch (HandleEditBoxKey(w, _selected_field, e)) { truelight@0: case 1: truelight@0: HandleButtonClick(w, 9); truelight@0: break; truelight@0: } truelight@0: break; truelight@193: truelight@0: } truelight@0: } truelight@0: truelight@0: static const Widget _network_start_server_window_widgets[] = { darkvater@172: { WWT_CLOSEBOX, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, darkvater@172: { WWT_CAPTION, BGC, 10, 399, 0, 13, STR_NETWORK_START_GAME_WINDOW, STR_NULL}, darkvater@172: { WWT_IMGBTN, BGC, 0, 399, 14, 199, 0x0, STR_NULL}, truelight@0: darkvater@172: { WWT_IMGBTN, BGC, 80, 190, 22, 33, 0x0, STR_NETWORK_NEW_GAME_NAME_TIP}, darkvater@172: { WWT_IMGBTN, BGC, 280, 390, 22, 33, 0x0, STR_NETWORK_PASSWORD_TIP}, truelight@0: darkvater@172: { WWT_IMGBTN, BGC, 10, 240, 62, 170, 0x0, STR_NETWORK_SELECT_MAP_TIP}, darkvater@172: { WWT_SCROLLBAR, BGC, 241, 251, 62, 170, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, truelight@0: darkvater@172: { WWT_6, BGC, 260, 390, 81, 92, STR_NETWORK_COMBO2, STR_NETWORK_NUMBER_OF_PLAYERS_TIP}, darkvater@172: { WWT_CLOSEBOX, BGC, 379, 389, 82, 91, STR_0225, STR_NETWORK_NUMBER_OF_PLAYERS_TIP}, truelight@0: darkvater@211: { WWT_PUSHTXTBTN, BTC, 10, 100, 180, 191, STR_NETWORK_START_GAME, STR_NETWORK_START_GAME_TIP}, darkvater@211: { WWT_PUSHTXTBTN, BTC, 110, 200, 180, 191, STR_NETWORK_LOAD_GAME, STR_NETWORK_LOAD_GAME_TIP}, darkvater@211: { WWT_PUSHTXTBTN, BTC, 210, 300, 180, 191, STR_NETWORK_LOAD_SCENARIO, STR_NETWORK_LOAD_SCENARIO_TIP}, darkvater@172: { WWT_PUSHTXTBTN, BTC, 310, 390, 180, 191, STR_012E_CANCEL, STR_NULL}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _network_start_server_window_desc = { truelight@0: WDP_CENTER, WDP_CENTER, 400, 200, truelight@0: WC_NETWORK_WINDOW,0, truelight@0: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, truelight@0: _network_start_server_window_widgets, truelight@0: NetworkStartServerWindowWndProc, truelight@0: }; truelight@0: truelight@0: static void ShowNetworkStartServerWindow() truelight@0: { truelight@0: Window *w; truelight@0: DeleteWindowById(WC_NETWORK_WINDOW, 0); truelight@193: truelight@0: w = AllocateWindowDesc(&_network_start_server_window_desc); truelight@0: strcpy(_edit_str_buf, ""); darkvater@211: w->disabled_state = (1<<4) | (1<<5) | (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working truelight@193: truelight@0: WP(w,querystr_d).caret = 1; truelight@0: WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; truelight@0: WP(w,querystr_d).maxwidth = 240; truelight@0: WP(w,querystr_d).buf = _edit_str_buf; truelight@0: } truelight@0: darkvater@175: #if 0 truelight@0: static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e) truelight@0: { truelight@0: switch(e->event) { truelight@0: case WE_PAINT: { truelight@193: truelight@0: SET_DPARAM16(7, STR_NETWORK_2_PLAYERS + _opt_mod_ptr->road_side); truelight@0: DrawWindowWidgets(w); truelight@0: truelight@0: GfxFillRect( 11, 31, 239, 239, 0xD7); truelight@0: GfxFillRect(261, 31, 378, 220, 0xD7); truelight@0: truelight@0: DrawEditBox(w, 5); truelight@0: DrawEditBox(w, 7); truelight@193: truelight@0: DrawString(10, 255, STR_NETWORK_COMPANY_NAME, 2); truelight@0: truelight@0: break; truelight@0: } truelight@0: truelight@0: case WE_CLICK: truelight@0: _selected_field = e->click.widget; truelight@0: switch(e->click.widget) { truelight@0: truelight@0: case 0: // close X truelight@0: case 13: // cancel button truelight@0: ShowNetworkGameWindow(); truelight@0: break; truelight@0: truelight@0: } truelight@0: truelight@0: case WE_MOUSELOOP: truelight@0: if(_selected_field == 5) truelight@0: { truelight@0: HandleEditBox(w, 5); truelight@0: break; truelight@0: } truelight@0: if(_selected_field == 7) truelight@0: { truelight@0: HandleEditBox(w, 7); truelight@0: break; truelight@0: } truelight@193: truelight@0: break; truelight@0: truelight@0: case WE_KEYPRESS: truelight@0: if(_selected_field != 5 && _selected_field != 7) truelight@0: break; truelight@0: switch (HandleEditBoxKey(w, _selected_field, e)) { truelight@0: case 1: truelight@0: HandleButtonClick(w, 12); truelight@0: break; truelight@0: } truelight@0: break; truelight@193: truelight@0: } truelight@0: } truelight@0: truelight@0: static const Widget _network_lobby_window_widgets[] = { darkvater@211: { WWT_CLOSEBOX, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, darkvater@175: { WWT_CAPTION, BGC, 10, 399, 0, 13, STR_NETWORK_GAME_LOBBY, STR_NULL}, darkvater@175: { WWT_IMGBTN, BGC, 0, 399, 14, 299, 0x0, STR_NULL}, truelight@0: truelight@0: // chat widget darkvater@175: { WWT_IMGBTN, BGC, 10, 240, 30, 240, 0x0, STR_NULL}, darkvater@175: { WWT_SCROLLBAR, BGC, 241, 251, 30, 240, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, truelight@0: truelight@0: // send message prompt darkvater@175: { WWT_IMGBTN, BGC, 10, 200, 241, 252, 0x0, STR_NETWORK_ENTER_NAME_TIP}, darkvater@175: { WWT_PUSHTXTBTN, BTC, 201, 251, 241, 252, STR_NETWORK_SEND, STR_NETWORK_SEND_TIP}, truelight@0: truelight@0: // company name darkvater@175: { WWT_IMGBTN, BGC, 100, 251, 254, 265, 0x0, STR_NETWORK_COMPANY_NAME_TIP}, truelight@0: truelight@0: // player information darkvater@175: { WWT_IMGBTN, BGC, 260, 379, 30, 221, 0x0, STR_NULL}, darkvater@175: { WWT_SCROLLBAR, BGC, 380, 390, 30, 221, 0x1, STR_0190_SCROLL_BAR_SCROLLS_LIST}, truelight@0: truelight@0: // buttons darkvater@175: { WWT_PUSHTXTBTN, BTC, 260, 390, 233, 244, STR_NETWORK_NEW_COMPANY, STR_NETWORK_NEW_COMPANY_TIP}, darkvater@175: { WWT_PUSHTXTBTN, BTC, 260, 390, 254, 265, STR_NETWORK_SPECTATE_GAME, STR_NETWORK_SPECTATE_GAME_TIP}, truelight@0: darkvater@175: { WWT_PUSHTXTBTN, BTC, 80, 180, 280, 291, STR_NETWORK_READY, STR_NULL}, darkvater@175: { WWT_PUSHTXTBTN, BTC, 220, 320, 280, 291, STR_012E_CANCEL, STR_NULL}, darkvater@176: { WIDGETS_END}, truelight@0: }; truelight@0: truelight@0: static const WindowDesc _network_lobby_window_desc = { truelight@0: WDP_CENTER, WDP_CENTER, 400, 300, truelight@0: WC_NETWORK_WINDOW,0, truelight@0: WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, truelight@0: _network_lobby_window_widgets, truelight@0: NetworkLobbyWindowWndProc, truelight@0: }; truelight@0: truelight@0: truelight@0: static void ShowNetworkLobbyWindow() truelight@0: { truelight@0: Window *w; truelight@0: DeleteWindowById(WC_NETWORK_WINDOW, 0); truelight@193: truelight@0: w = AllocateWindowDesc(&_network_lobby_window_desc); truelight@0: strcpy(_edit_str_buf, ""); truelight@0: truelight@193: truelight@0: WP(w,querystr_d).caret = 1; truelight@0: WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN; truelight@0: WP(w,querystr_d).maxwidth = 240; truelight@0: WP(w,querystr_d).buf = _edit_str_buf; truelight@0: } darkvater@175: #endif