15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2012, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/main_wnd.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <math.h> 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/logging.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/defaults.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgATOM MainWnd::wnd_class_ = 0; 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst wchar_t MainWnd::kClassName[] = L"WebRTC_MainWnd"; 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace { 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kConnecting[] = "Connecting... "; 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kNoVideoStreams[] = "(no video streams either way)"; 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst char kNoIncomingStream[] = "(no incoming video)"; 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid CalculateWindowSizeForText(HWND wnd, const wchar_t* text, 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t* width, size_t* height) { 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HDC dc = ::GetDC(wnd); 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT text_rc = {0}; 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DrawText(dc, text, -1, &text_rc, DT_CALCRECT | DT_SINGLELINE); 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::ReleaseDC(wnd, dc); 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT client, window; 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetClientRect(wnd, &client); 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetWindowRect(wnd, &window); 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *width = text_rc.right - text_rc.left; 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *width += (window.right - window.left) - 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (client.right - client.left); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *height = text_rc.bottom - text_rc.top; 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *height += (window.bottom - window.top) - 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (client.bottom - client.top); 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgHFONT GetDefaultFont() { 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static HFONT font = reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT)); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return font; 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstd::string GetWindowText(HWND wnd) { 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char text[MAX_PATH] = {0}; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetWindowTextA(wnd, &text[0], ARRAYSIZE(text)); 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return text; 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid AddListBoxItem(HWND listbox, const std::string& str, LPARAM item_data) { 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LRESULT index = ::SendMessageA(listbox, LB_ADDSTRING, 0, 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org reinterpret_cast<LPARAM>(str.c_str())); 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SendMessageA(listbox, LB_SETITEMDATA, index, item_data); 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::MainWnd() 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : ui_(CONNECT_TO_SERVER), wnd_(NULL), edit1_(NULL), edit2_(NULL), 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org label1_(NULL), label2_(NULL), button_(NULL), listbox_(NULL), 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org destroyed_(false), callback_(NULL), nested_msg_(NULL) { 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::~MainWnd() { 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(!IsWindow()); 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::Create() { 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(wnd_ == NULL); 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!RegisterWindowClass()) 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ui_thread_id_ = ::GetCurrentThreadId(); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wnd_ = ::CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, kClassName, L"WebRTC", 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org NULL, NULL, GetModuleHandle(NULL), this); 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SendMessage(wnd_, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()), 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TRUE); 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindows(); 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SwitchToConnectUI(); 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return wnd_ != NULL; 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::Destroy() { 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BOOL ret = FALSE; 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsWindow()) { 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ret = ::DestroyWindow(wnd_); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return ret != FALSE; 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::RegisterObserver(MainWndCallback* callback) { 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_ = callback; 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::IsWindow() { 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return wnd_ && ::IsWindow(wnd_) != FALSE; 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::PreTranslateMessage(MSG* msg) { 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool ret = false; 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (msg->message == WM_CHAR) { 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (msg->wParam == VK_TAB) { 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HandleTabbing(); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ret = true; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (msg->wParam == VK_RETURN) { 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org OnDefaultAction(); 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ret = true; 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (msg->wParam == VK_ESCAPE) { 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (callback_) { 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ui_ == STREAMING) { 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->DisconnectFromCurrentPeer(); 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->DisconnectFromServer(); 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (msg->hwnd == NULL && msg->message == UI_THREAD_CALLBACK) { 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->UIThreadCallback(static_cast<int>(msg->wParam), 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org reinterpret_cast<void*>(msg->lParam)); 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ret = true; 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return ret; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToConnectUI() { 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(IsWindow()); 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutPeerListUI(false); 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ui_ = CONNECT_TO_SERVER; 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutConnectUI(true); 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetFocus(edit1_); 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToPeerList(const Peers& peers) { 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutConnectUI(false); 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SendMessage(listbox_, LB_RESETCONTENT, 0, 0); 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddListBoxItem(listbox_, "List of currently connected peers:", -1); 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Peers::const_iterator i = peers.begin(); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (; i != peers.end(); ++i) 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AddListBoxItem(listbox_, i->second.c_str(), i->first); 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ui_ = LIST_PEERS; 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutPeerListUI(true); 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetFocus(listbox_); 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::SwitchToStreamingUI() { 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutConnectUI(false); 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutPeerListUI(false); 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ui_ = STREAMING; 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::MessageBox(const char* caption, const char* text, bool is_error) { 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DWORD flags = MB_OK; 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (is_error) 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org flags |= MB_ICONERROR; 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::MessageBoxA(handle(), text, caption, flags); 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StartLocalRenderer(webrtc::VideoTrackInterface* local_video) { 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org local_renderer_.reset(new VideoRenderer(handle(), 1, 1, local_video)); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StopLocalRenderer() { 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org local_renderer_.reset(); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video) { 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_renderer_.reset(new VideoRenderer(handle(), 1, 1, remote_video)); 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::StopRemoteRenderer() { 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org remote_renderer_.reset(); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::QueueUIThreadCallback(int msg_id, void* data) { 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::PostThreadMessage(ui_thread_id_, UI_THREAD_CALLBACK, 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static_cast<WPARAM>(msg_id), reinterpret_cast<LPARAM>(data)); 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnPaint() { 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PAINTSTRUCT ps; 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::BeginPaint(handle(), &ps); 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT rc; 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetClientRect(handle(), &rc); 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoRenderer* local_renderer = local_renderer_.get(); 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoRenderer* remote_renderer = remote_renderer_.get(); 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ui_ == STREAMING && remote_renderer && local_renderer) { 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AutoLock<VideoRenderer> local_lock(local_renderer); 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AutoLock<VideoRenderer> remote_lock(remote_renderer); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const BITMAPINFO& bmi = remote_renderer->bmi(); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int height = abs(bmi.bmiHeader.biHeight); 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int width = bmi.bmiHeader.biWidth; 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const uint8* image = remote_renderer->image(); 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (image != NULL) { 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HDC dc_mem = ::CreateCompatibleDC(ps.hdc); 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetStretchBltMode(dc_mem, HALFTONE); 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set the map mode so that the ratio will be maintained for us. 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HDC all_dc[] = { ps.hdc, dc_mem }; 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (int i = 0; i < ARRAY_SIZE(all_dc); ++i) { 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetMapMode(all_dc[i], MM_ISOTROPIC); 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetWindowExtEx(all_dc[i], width, height, NULL); 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetViewportExtEx(all_dc[i], rc.right, rc.bottom, NULL); 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HBITMAP bmp_mem = ::CreateCompatibleBitmap(ps.hdc, rc.right, rc.bottom); 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HGDIOBJ bmp_old = ::SelectObject(dc_mem, bmp_mem); 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org POINT logical_area = { rc.right, rc.bottom }; 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DPtoLP(ps.hdc, &logical_area, 1); 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0)); 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT logical_rect = {0, 0, logical_area.x, logical_area.y }; 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::FillRect(dc_mem, &logical_rect, brush); 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteObject(brush); 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int x = (logical_area.x / 2) - (width / 2); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int y = (logical_area.y / 2) - (height / 2); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StretchDIBits(dc_mem, x, y, width, height, 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 0, 0, width, height, image, &bmi, DIB_RGB_COLORS, SRCCOPY); 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if ((rc.right - rc.left) > 200 && (rc.bottom - rc.top) > 200) { 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const BITMAPINFO& bmi = local_renderer->bmi(); 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org image = local_renderer->image(); 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int thumb_width = bmi.bmiHeader.biWidth / 4; 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int thumb_height = abs(bmi.bmiHeader.biHeight) / 4; 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StretchDIBits(dc_mem, 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org logical_area.x - thumb_width - 10, 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org logical_area.y - thumb_height - 10, 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org thumb_width, thumb_height, 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 0, 0, bmi.bmiHeader.biWidth, -bmi.bmiHeader.biHeight, 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org image, &bmi, DIB_RGB_COLORS, SRCCOPY); 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org BitBlt(ps.hdc, 0, 0, logical_area.x, logical_area.y, 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org dc_mem, 0, 0, SRCCOPY); 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Cleanup. 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SelectObject(dc_mem, bmp_old); 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteObject(bmp_mem); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteDC(dc_mem); 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // We're still waiting for the video stream to be initialized. 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0)); 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::FillRect(ps.hdc, &rc, brush); 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteObject(brush); 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HGDIOBJ old_font = ::SelectObject(ps.hdc, GetDefaultFont()); 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetTextColor(ps.hdc, RGB(0xff, 0xff, 0xff)); 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetBkMode(ps.hdc, TRANSPARENT); 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string text(kConnecting); 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!local_renderer->image()) { 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org text += kNoVideoStreams; 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org text += kNoIncomingStream; 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DrawTextA(ps.hdc, text.c_str(), -1, &rc, 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DT_SINGLELINE | DT_CENTER | DT_VCENTER); 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SelectObject(ps.hdc, old_font); 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HBRUSH brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW)); 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::FillRect(ps.hdc, &rc, brush); 3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteObject(brush); 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::EndPaint(handle(), &ps); 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnDestroyed() { 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PostQuitMessage(0); 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::OnDefaultAction() { 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!callback_) 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ui_ == CONNECT_TO_SERVER) { 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string server(GetWindowText(edit1_)); 3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string port_str(GetWindowText(edit2_)); 3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int port = port_str.length() ? atoi(port_str.c_str()) : 0; 3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->StartLogin(server, port); 3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (ui_ == LIST_PEERS) { 3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LRESULT sel = ::SendMessage(listbox_, LB_GETCURSEL, 0, 0); 3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (sel != LB_ERR) { 3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LRESULT peer_id = ::SendMessage(listbox_, LB_GETITEMDATA, sel, 0); 3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (peer_id != -1 && callback_) { 3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->ConnectToPeer(peer_id); 3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MessageBoxA(wnd_, "OK!", "Yeah", MB_OK); 3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) { 3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org switch (msg) { 3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_ERASEBKGND: 3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *result = TRUE; 3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_PAINT: 3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org OnPaint(); 3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_SETFOCUS: 3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ui_ == CONNECT_TO_SERVER) { 3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetFocus(edit1_); 3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (ui_ == LIST_PEERS) { 3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SetFocus(listbox_); 3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_SIZE: 3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (ui_ == CONNECT_TO_SERVER) { 3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutConnectUI(true); 3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (ui_ == LIST_PEERS) { 3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LayoutPeerListUI(true); 3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_CTLCOLORSTATIC: 3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *result = reinterpret_cast<LRESULT>(GetSysColorBrush(COLOR_WINDOW)); 3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_COMMAND: 3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (button_ == reinterpret_cast<HWND>(lp)) { 3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (BN_CLICKED == HIWORD(wp)) 3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org OnDefaultAction(); 3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (listbox_ == reinterpret_cast<HWND>(lp)) { 3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (LBN_DBLCLK == HIWORD(wp)) { 3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org OnDefaultAction(); 3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org case WM_CLOSE: 3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (callback_) 3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_->Close(); 3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// static 3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgLRESULT CALLBACK MainWnd::WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MainWnd* me = reinterpret_cast<MainWnd*>( 3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetWindowLongPtr(hwnd, GWLP_USERDATA)); 3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!me && WM_CREATE == msg) { 3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lp); 3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me = reinterpret_cast<MainWnd*>(cs->lpCreateParams); 3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->wnd_ = hwnd; 3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(me)); 3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LRESULT result = 0; 3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (me) { 3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void* prev_nested_msg = me->nested_msg_; 3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->nested_msg_ = &msg; 3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool handled = me->OnMessage(msg, wp, lp, &result); 4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (WM_NCDESTROY == msg) { 4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->destroyed_ = true; 4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else if (!handled) { 4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org result = ::DefWindowProc(hwnd, msg, wp, lp); 4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (me->destroyed_ && prev_nested_msg == NULL) { 4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->OnDestroyed(); 4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->wnd_ = NULL; 4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->destroyed_ = false; 4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org me->nested_msg_ = prev_nested_msg; 4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org result = ::DefWindowProc(hwnd, msg, wp, lp); 4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// static 4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool MainWnd::RegisterWindowClass() { 4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (wnd_class_) 4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org WNDCLASSEX wcex = { sizeof(WNDCLASSEX) }; 4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.style = CS_DBLCLKS; 4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.hInstance = GetModuleHandle(NULL); 4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1); 4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW); 4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.lpfnWndProc = &WndProc; 4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wcex.lpszClassName = kClassName; 4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org wnd_class_ = ::RegisterClassEx(&wcex); 4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(wnd_class_ != 0); 4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return wnd_class_ != 0; 4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::CreateChildWindow(HWND* wnd, MainWnd::ChildWindowID id, 4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const wchar_t* class_name, DWORD control_style, 4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DWORD ex_style) { 4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (::IsWindow(*wnd)) 4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Child windows are invisible at first, and shown after being resized. 4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DWORD style = WS_CHILD | control_style; 4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *wnd = ::CreateWindowEx(ex_style, class_name, L"", style, 4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 100, 100, 100, 100, wnd_, 4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org reinterpret_cast<HMENU>(id), 4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GetModuleHandle(NULL), NULL); 4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(::IsWindow(*wnd) != FALSE); 4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SendMessage(*wnd, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()), 4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TRUE); 4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::CreateChildWindows() { 4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create the child windows in tab order. 4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&label1_, LABEL1_ID, L"Static", ES_CENTER | ES_READONLY, 0); 4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&edit1_, EDIT_ID, L"Edit", 4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE); 4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&label2_, LABEL2_ID, L"Static", ES_CENTER | ES_READONLY, 0); 4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&edit2_, EDIT_ID, L"Edit", 4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE); 4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&button_, BUTTON_ID, L"Button", BS_CENTER | WS_TABSTOP, 0); 4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CreateChildWindow(&listbox_, LISTBOX_ID, L"ListBox", 4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LBS_HASSTRINGS | LBS_NOTIFY, WS_EX_CLIENTEDGE); 4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetWindowTextA(edit1_, GetDefaultServerName().c_str()); 4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetWindowTextA(edit2_, "8888"); 4705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::LayoutConnectUI(bool show) { 4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org struct Windows { 4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HWND wnd; 4755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const wchar_t* text; 4765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t width; 4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t height; 4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } windows[] = { 4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { label1_, L"Server" }, 4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { edit1_, L"XXXyyyYYYgggXXXyyyYYYggg" }, 4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { label2_, L":" }, 4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { edit2_, L"XyXyX" }, 4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { button_, L"Connect" }, 4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org }; 4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (show) { 4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t kSeparator = 5; 4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t total_width = (ARRAYSIZE(windows) - 1) * kSeparator; 4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < ARRAYSIZE(windows); ++i) { 4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CalculateWindowSizeForText(windows[i].wnd, windows[i].text, 4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &windows[i].width, &windows[i].height); 4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org total_width += windows[i].width; 4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT rc; 4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetClientRect(wnd_, &rc); 4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t x = (rc.right / 2) - (total_width / 2); 4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t y = rc.bottom / 2; 5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < ARRAYSIZE(windows); ++i) { 5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t top = y - (windows[i].height / 2); 502b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org ::MoveWindow(windows[i].wnd, static_cast<int>(x), static_cast<int>(top), 503b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org static_cast<int>(windows[i].width), 504b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org static_cast<int>(windows[i].height), 5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TRUE); 5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org x += kSeparator + windows[i].width; 5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (windows[i].text[0] != 'X') 5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetWindowText(windows[i].wnd, windows[i].text); 5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::ShowWindow(windows[i].wnd, SW_SHOWNA); 5105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 5125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < ARRAYSIZE(windows); ++i) { 5135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::ShowWindow(windows[i].wnd, SW_HIDE); 5145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::LayoutPeerListUI(bool show) { 5195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (show) { 5205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RECT rc; 5215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::GetClientRect(wnd_, &rc); 5225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::MoveWindow(listbox_, 0, 0, rc.right, rc.bottom, TRUE); 5235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::ShowWindow(listbox_, SW_SHOWNA); 5245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } else { 5255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::ShowWindow(listbox_, SW_HIDE); 5265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InvalidateRect(wnd_, NULL, TRUE); 5275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::HandleTabbing() { 5315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool shift = ((::GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0); 5325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org UINT next_cmd = shift ? GW_HWNDPREV : GW_HWNDNEXT; 5335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org UINT loop_around_cmd = shift ? GW_HWNDLAST : GW_HWNDFIRST; 5345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HWND focus = GetFocus(), next; 5355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org do { 5365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org next = ::GetWindow(focus, next_cmd); 5375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsWindowVisible(next) && 5385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) { 5395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 5405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!next) { 5435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org next = ::GetWindow(focus, loop_around_cmd); 5445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (IsWindowVisible(next) && 5455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) { 5465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 5475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 5495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org focus = next; 5505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } while (true); 5515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::SetFocus(next); 5525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// 5555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// MainWnd::VideoRenderer 5565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// 5575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::VideoRenderer::VideoRenderer( 5595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org HWND wnd, int width, int height, 5605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::VideoTrackInterface* track_to_render) 5615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : wnd_(wnd), rendered_track_(track_to_render) { 5625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::InitializeCriticalSection(&buffer_lock_); 5635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ZeroMemory(&bmi_, sizeof(bmi_)); 5645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 5655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biPlanes = 1; 5665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biBitCount = 32; 5675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biCompression = BI_RGB; 5685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biWidth = width; 5695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biHeight = -height; 5705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biSizeImage = width * height * 5715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (bmi_.bmiHeader.biBitCount >> 3); 5725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org rendered_track_->AddRenderer(this); 5735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgMainWnd::VideoRenderer::~VideoRenderer() { 5765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org rendered_track_->RemoveRenderer(this); 5775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ::DeleteCriticalSection(&buffer_lock_); 5785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::VideoRenderer::SetSize(int width, int height) { 5815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AutoLock<VideoRenderer> lock(this); 5825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biWidth = width; 5845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biHeight = -height; 5855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biSizeImage = width * height * 5865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org (bmi_.bmiHeader.biBitCount >> 3); 5875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org image_.reset(new uint8[bmi_.bmiHeader.biSizeImage]); 5885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid MainWnd::VideoRenderer::RenderFrame(const cricket::VideoFrame* frame) { 5915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (!frame) 5925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return; 5935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 5955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AutoLock<VideoRenderer> lock(this); 5965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ASSERT(image_.get() != NULL); 5985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org frame->ConvertToRgbBuffer(cricket::FOURCC_ARGB, 5995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org image_.get(), 6005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biSizeImage, 6015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biWidth * 6025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bmi_.bmiHeader.biBitCount / 8); 6035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 6045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org InvalidateRect(wnd_, NULL, TRUE); 6055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 606