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 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef PEERCONNECTION_SAMPLES_CLIENT_LINUX_MAIN_WND_H_ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define PEERCONNECTION_SAMPLES_CLIENT_LINUX_MAIN_WND_H_ 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/main_wnd.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/examples/peerconnection/client/peer_connection_client.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Forward declarations. 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct _GtkWidget GtkWidget; 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef union _GdkEvent GdkEvent; 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct _GdkEventKey GdkEventKey; 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct _GtkTreeView GtkTreeView; 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct _GtkTreePath GtkTreePath; 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtypedef struct _GtkTreeViewColumn GtkTreeViewColumn; 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Implements the main UI of the peer connection client. 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This is functionally equivalent to the MainWnd class in the Windows 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// implementation. 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass GtkMainWnd : public MainWindow { 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkMainWnd(const char* server, int port, bool autoconnect, bool autocall); 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ~GtkMainWnd(); 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void RegisterObserver(MainWndCallback* callback); 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool IsWindow(); 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SwitchToConnectUI(); 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SwitchToPeerList(const Peers& peers); 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SwitchToStreamingUI(); 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void MessageBox(const char* caption, const char* text, 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool is_error); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual MainWindow::UI current_ui(); 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void StartLocalRenderer(webrtc::VideoTrackInterface* local_video); 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void StopLocalRenderer(); 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video); 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void StopRemoteRenderer(); 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void QueueUIThreadCallback(int msg_id, void* data); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates and shows the main window with the |Connect UI| enabled. 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool Create(); 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Destroys the window. When the window is destroyed, it ends the 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // main message loop. 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool Destroy(); 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Callback for when the main window is destroyed. 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnDestroyed(GtkWidget* widget, GdkEvent* event); 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Callback for when the user clicks the "Connect" button. 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnClicked(GtkWidget* widget); 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Callback for keystrokes. Used to capture Esc and Return. 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnKeyPress(GtkWidget* widget, GdkEventKey* key); 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Callback when the user double clicks a peer in order to initiate a 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // connection. 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRowActivated(GtkTreeView* tree_view, GtkTreePath* path, 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkTreeViewColumn* column); 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRedraw(); 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org class VideoRenderer : public webrtc::VideoRendererInterface { 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org VideoRenderer(GtkMainWnd* main_wnd, 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org webrtc::VideoTrackInterface* track_to_render); 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~VideoRenderer(); 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // VideoRendererInterface implementation 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SetSize(int width, int height); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void RenderFrame(const cricket::VideoFrame* frame); 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const uint8* image() const { 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return image_.get(); 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int width() const { 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return width_; 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int height() const { 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return height_; 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 113582fe818e571fa2571267f5e369715188472f352wu@webrtc.org talk_base::scoped_ptr<uint8[]> image_; 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int width_; 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int height_; 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkMainWnd* main_wnd_; 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrackInterface> rendered_track_; 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org }; 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* window_; // Our main window. 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* draw_area_; // The drawing surface for rendering video streams. 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* vbox_; // Container for the Connect UI. 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* server_edit_; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* port_edit_; 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org GtkWidget* peer_list_; // The list of peers. 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org MainWndCallback* callback_; 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string server_; 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string port_; 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool autoconnect_; 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool autocall_; 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<VideoRenderer> local_renderer_; 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<VideoRenderer> remote_renderer_; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<uint8> draw_buffer_; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int draw_buffer_size_; 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // PEERCONNECTION_SAMPLES_CLIENT_LINUX_MAIN_WND_H_ 139