comparison src/network/network_gui.cpp @ 6531:77a5d2b51cfc draft

(svn r9719) -Fix: in-game private messages did not work for clients with a Client ID > 255.
author rubidium <rubidium@openttd.org>
date Thu, 26 Apr 2007 07:41:24 +0000
parents e0b6c88a6650
children 05ca25dd9fa4
comparison
equal deleted inserted replaced
6530:01978c632f97 6531:77a5d2b51cfc
1467 w = AllocateWindowDesc(&_network_join_status_window_desc); 1467 w = AllocateWindowDesc(&_network_join_status_window_desc);
1468 /* Parent the status window to the lobby */ 1468 /* Parent the status window to the lobby */
1469 if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0); 1469 if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0);
1470 } 1470 }
1471 1471
1472 static void SendChat(const char *buf, DestType type, byte dest) 1472 static void SendChat(const char *buf, DestType type, int dest)
1473 { 1473 {
1474 if (buf[0] == '\0') return; 1474 if (buf[0] == '\0') return;
1475 if (!_network_server) { 1475 if (!_network_server) {
1476 SEND_COMMAND(PACKET_CLIENT_CHAT)((NetworkAction)(NETWORK_ACTION_CHAT + type), type, dest, buf); 1476 SEND_COMMAND(PACKET_CLIENT_CHAT)((NetworkAction)(NETWORK_ACTION_CHAT + type), type, dest, buf);
1477 } else { 1477 } else {
1531 * See if we can auto-complete the current text of the user. 1531 * See if we can auto-complete the current text of the user.
1532 */ 1532 */
1533 static void ChatTabCompletion(Window *w) 1533 static void ChatTabCompletion(Window *w)
1534 { 1534 {
1535 static char _chat_tab_completion_buf[lengthof(_edit_str_buf)]; 1535 static char _chat_tab_completion_buf[lengthof(_edit_str_buf)];
1536 Textbuf *tb = &WP(w, querystr_d).text; 1536 Textbuf *tb = &WP(w, chatquerystr_d).text;
1537 uint len, tb_len; 1537 uint len, tb_len;
1538 uint item; 1538 uint item;
1539 char *tb_buf, *pre_buf; 1539 char *tb_buf, *pre_buf;
1540 const char *cur_name; 1540 const char *cur_name;
1541 bool second_scan = false; 1541 bool second_scan = false;
1589 } else { 1589 } else {
1590 snprintf(tb->buf, lengthof(_edit_str_buf), "%s %s", pre_buf, cur_name); 1590 snprintf(tb->buf, lengthof(_edit_str_buf), "%s %s", pre_buf, cur_name);
1591 } 1591 }
1592 1592
1593 /* Update the textbuffer */ 1593 /* Update the textbuffer */
1594 UpdateTextBufferSize(&WP(w, querystr_d).text); 1594 UpdateTextBufferSize(&WP(w, chatquerystr_d).text);
1595 1595
1596 SetWindowDirty(w); 1596 SetWindowDirty(w);
1597 free(pre_buf); 1597 free(pre_buf);
1598 return; 1598 return;
1599 } 1599 }
1603 /* We walked all posibilities, and the user presses tab again.. revert to original text */ 1603 /* We walked all posibilities, and the user presses tab again.. revert to original text */
1604 strcpy(tb->buf, _chat_tab_completion_buf); 1604 strcpy(tb->buf, _chat_tab_completion_buf);
1605 _chat_tab_completion_active = false; 1605 _chat_tab_completion_active = false;
1606 1606
1607 /* Update the textbuffer */ 1607 /* Update the textbuffer */
1608 UpdateTextBufferSize(&WP(w, querystr_d).text); 1608 UpdateTextBufferSize(&WP(w, chatquerystr_d).text);
1609 1609
1610 SetWindowDirty(w); 1610 SetWindowDirty(w);
1611 } 1611 }
1612 free(pre_buf); 1612 free(pre_buf);
1613 } 1613 }
1614 1614
1615 /* uses querystr_d WP macro 1615 /*
1616 * uses querystr_d->caption to store 1616 * uses chatquerystr_d WP macro
1617 * - type of chat message (Private/Team/All) in bytes 0-7 1617 * uses chatquerystr_d->caption to store type of chat message (Private/Team/All)
1618 * - destination of chat message in the case of Team/Private in bytes 8-15 */ 1618 */
1619 static void ChatWindowWndProc(Window *w, WindowEvent *e) 1619 static void ChatWindowWndProc(Window *w, WindowEvent *e)
1620 { 1620 {
1621 switch (e->event) { 1621 switch (e->event) {
1622 case WE_CREATE: 1622 case WE_CREATE:
1623 SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0); 1623 SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
1632 }; 1632 };
1633 StringID msg; 1633 StringID msg;
1634 1634
1635 DrawWindowWidgets(w); 1635 DrawWindowWidgets(w);
1636 1636
1637 assert(GB(WP(w, querystr_d).caption, 0, 8) < lengthof(chat_captions)); 1637 assert(WP(w, chatquerystr_d).caption < lengthof(chat_captions));
1638 msg = chat_captions[GB(WP(w, querystr_d).caption, 0, 8)]; 1638 msg = chat_captions[WP(w, chatquerystr_d).caption];
1639 DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, 16); 1639 DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, 16);
1640 DrawEditBox(w, &WP(w, querystr_d), 2); 1640 DrawEditBox(w, &WP(w, chatquerystr_d), 2);
1641 } break; 1641 } break;
1642 1642
1643 case WE_CLICK: 1643 case WE_CLICK:
1644 switch (e->we.click.widget) { 1644 switch (e->we.click.widget) {
1645 case 3: { /* Send */ 1645 case 3: { /* Send */
1646 DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8); 1646 DestType type = (DestType)WP(w, chatquerystr_d).caption;
1647 byte dest = GB(WP(w, querystr_d).caption, 8, 8); 1647 int dest = WP(w, chatquerystr_d).dest;
1648 SendChat(WP(w, querystr_d).text.buf, type, dest); 1648 SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
1649 } /* FALLTHROUGH */ 1649 } /* FALLTHROUGH */
1650 case 0: /* Cancel */ DeleteWindow(w); break; 1650 case 0: /* Cancel */ DeleteWindow(w); break;
1651 } 1651 }
1652 break; 1652 break;
1653 1653
1654 case WE_MOUSELOOP: 1654 case WE_MOUSELOOP:
1655 HandleEditBox(w, &WP(w, querystr_d), 2); 1655 HandleEditBox(w, &WP(w, chatquerystr_d), 2);
1656 break; 1656 break;
1657 1657
1658 case WE_KEYPRESS: 1658 case WE_KEYPRESS:
1659 if (e->we.keypress.keycode == WKC_TAB) { 1659 if (e->we.keypress.keycode == WKC_TAB) {
1660 ChatTabCompletion(w); 1660 ChatTabCompletion(w);
1661 } else { 1661 } else {
1662 _chat_tab_completion_active = false; 1662 _chat_tab_completion_active = false;
1663 switch (HandleEditBoxKey(w, &WP(w, querystr_d), 2, e)) { 1663 switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
1664 case 1: { /* Return */ 1664 case 1: { /* Return */
1665 DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8); 1665 DestType type = (DestType)WP(w, chatquerystr_d).caption;
1666 byte dest = GB(WP(w, querystr_d).caption, 8, 8); 1666 int dest = WP(w, chatquerystr_d).dest;
1667 SendChat(WP(w, querystr_d).text.buf, type, dest); 1667 SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
1668 } /* FALLTHROUGH */ 1668 } /* FALLTHROUGH */
1669 case 2: /* Escape */ DeleteWindow(w); break; 1669 case 2: /* Escape */ DeleteWindow(w); break;
1670 } 1670 }
1671 } 1671 }
1672 break; 1672 break;
1692 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET, 1692 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
1693 _chat_window_widgets, 1693 _chat_window_widgets,
1694 ChatWindowWndProc 1694 ChatWindowWndProc
1695 }; 1695 };
1696 1696
1697 void ShowNetworkChatQueryWindow(DestType type, byte dest) 1697 void ShowNetworkChatQueryWindow(DestType type, int dest)
1698 { 1698 {
1699 Window *w; 1699 Window *w;
1700 1700
1701 DeleteWindowById(WC_SEND_NETWORK_MSG, 0); 1701 DeleteWindowById(WC_SEND_NETWORK_MSG, 0);
1702 1702
1704 _chat_tab_completion_active = false; 1704 _chat_tab_completion_active = false;
1705 1705
1706 w = AllocateWindowDesc(&_chat_window_desc); 1706 w = AllocateWindowDesc(&_chat_window_desc);
1707 1707
1708 LowerWindowWidget(w, 2); 1708 LowerWindowWidget(w, 2);
1709 WP(w, querystr_d).caption = GB(type, 0, 8) | (dest << 8); // Misuse of caption 1709 WP(w, chatquerystr_d).caption = type; // Misuse of caption
1710 WP(w, querystr_d).afilter = CS_ALPHANUMERAL; 1710 WP(w, chatquerystr_d).dest = dest;
1711 InitializeTextBuffer(&WP(w, querystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0); 1711 WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
1712 InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
1712 } 1713 }
1713 1714
1714 #endif /* ENABLE_NETWORK */ 1715 #endif /* ENABLE_NETWORK */