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