| Index: webrtc/examples/peerconnection/client/linux/main_wnd.cc
|
| diff --git a/webrtc/examples/peerconnection/client/linux/main_wnd.cc b/webrtc/examples/peerconnection/client/linux/main_wnd.cc
|
| index 8d7d11ac153727d1489ebfe43e2381ff20885975..fa7ea4e8d07aa44dad9ea6e209e0fe8d4fb92010 100644
|
| --- a/webrtc/examples/peerconnection/client/linux/main_wnd.cc
|
| +++ b/webrtc/examples/peerconnection/client/linux/main_wnd.cc
|
| @@ -118,6 +118,12 @@ gboolean Redraw(gpointer data) {
|
| return false;
|
| }
|
|
|
| +gboolean Draw(GtkWidget* widget, cairo_t* cr, gpointer data) {
|
| + GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data);
|
| + wnd->Draw(widget, cr);
|
| + return false;
|
| +}
|
| +
|
| } // namespace
|
|
|
| //
|
| @@ -232,12 +238,20 @@ void GtkMainWnd::SwitchToConnectUI() {
|
| peer_list_ = NULL;
|
| }
|
|
|
| +#if GTK_MAJOR_VERSION == 2
|
| vbox_ = gtk_vbox_new(FALSE, 5);
|
| +#else
|
| + vbox_ = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
|
| +#endif
|
| GtkWidget* valign = gtk_alignment_new(0, 1, 0, 0);
|
| gtk_container_add(GTK_CONTAINER(vbox_), valign);
|
| gtk_container_add(GTK_CONTAINER(window_), vbox_);
|
|
|
| +#if GTK_MAJOR_VERSION == 2
|
| GtkWidget* hbox = gtk_hbox_new(FALSE, 5);
|
| +#else
|
| + GtkWidget* hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
|
| +#endif
|
|
|
| GtkWidget* label = gtk_label_new("Server");
|
| gtk_container_add(GTK_CONTAINER(hbox), label);
|
| @@ -317,6 +331,7 @@ void GtkMainWnd::SwitchToStreamingUI() {
|
|
|
| draw_area_ = gtk_drawing_area_new();
|
| gtk_container_add(GTK_CONTAINER(window_), draw_area_);
|
| + g_signal_connect(G_OBJECT(draw_area_), "draw", G_CALLBACK(&::Draw), this);
|
|
|
| gtk_widget_show_all(window_);
|
| }
|
| @@ -345,26 +360,35 @@ void GtkMainWnd::OnClicked(GtkWidget* widget) {
|
| void GtkMainWnd::OnKeyPress(GtkWidget* widget, GdkEventKey* key) {
|
| if (key->type == GDK_KEY_PRESS) {
|
| switch (key->keyval) {
|
| - case GDK_Escape:
|
| - if (draw_area_) {
|
| - callback_->DisconnectFromCurrentPeer();
|
| - } else if (peer_list_) {
|
| - callback_->DisconnectFromServer();
|
| - }
|
| - break;
|
| +#if GTK_MAJOR_VERSION == 2
|
| + case GDK_Escape:
|
| +#else
|
| + case GDK_KEY_Escape:
|
| +#endif
|
| + if (draw_area_) {
|
| + callback_->DisconnectFromCurrentPeer();
|
| + } else if (peer_list_) {
|
| + callback_->DisconnectFromServer();
|
| + }
|
| + break;
|
|
|
| - case GDK_KP_Enter:
|
| - case GDK_Return:
|
| - if (vbox_) {
|
| - OnClicked(NULL);
|
| - } else if (peer_list_) {
|
| - // OnRowActivated will be called automatically when the user
|
| - // presses enter.
|
| - }
|
| - break;
|
| +#if GTK_MAJOR_VERSION == 2
|
| + case GDK_KP_Enter:
|
| + case GDK_Return:
|
| +#else
|
| + case GDK_KEY_KP_Enter:
|
| + case GDK_KEY_Return:
|
| +#endif
|
| + if (vbox_) {
|
| + OnClicked(NULL);
|
| + } else if (peer_list_) {
|
| + // OnRowActivated will be called automatically when the user
|
| + // presses enter.
|
| + }
|
| + break;
|
|
|
| - default:
|
| - break;
|
| + default:
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -392,30 +416,30 @@ void GtkMainWnd::OnRedraw() {
|
| VideoRenderer* remote_renderer = remote_renderer_.get();
|
| if (remote_renderer && remote_renderer->image() != NULL &&
|
| draw_area_ != NULL) {
|
| - int width = remote_renderer->width();
|
| - int height = remote_renderer->height();
|
| + width_ = remote_renderer->width();
|
| + height_ = remote_renderer->height();
|
|
|
| if (!draw_buffer_.get()) {
|
| - draw_buffer_size_ = (width * height * 4) * 4;
|
| + draw_buffer_size_ = (width_ * height_ * 4) * 4;
|
| draw_buffer_.reset(new uint8_t[draw_buffer_size_]);
|
| - gtk_widget_set_size_request(draw_area_, width * 2, height * 2);
|
| + gtk_widget_set_size_request(draw_area_, width_ * 2, height_ * 2);
|
| }
|
|
|
| const uint32_t* image =
|
| reinterpret_cast<const uint32_t*>(remote_renderer->image());
|
| uint32_t* scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
|
| - for (int r = 0; r < height; ++r) {
|
| - for (int c = 0; c < width; ++c) {
|
| + for (int r = 0; r < height_; ++r) {
|
| + for (int c = 0; c < width_; ++c) {
|
| int x = c * 2;
|
| scaled[x] = scaled[x + 1] = image[c];
|
| }
|
|
|
| uint32_t* prev_line = scaled;
|
| - scaled += width * 2;
|
| - memcpy(scaled, prev_line, (width * 2) * 4);
|
| + scaled += width_ * 2;
|
| + memcpy(scaled, prev_line, (width_ * 2) * 4);
|
|
|
| - image += width;
|
| - scaled += width * 2;
|
| + image += width_;
|
| + scaled += width_ * 2;
|
| }
|
|
|
| VideoRenderer* local_renderer = local_renderer_.get();
|
| @@ -423,37 +447,50 @@ void GtkMainWnd::OnRedraw() {
|
| image = reinterpret_cast<const uint32_t*>(local_renderer->image());
|
| scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
|
| // Position the local preview on the right side.
|
| - scaled += (width * 2) - (local_renderer->width() / 2);
|
| + scaled += (width_ * 2) - (local_renderer->width() / 2);
|
| // right margin...
|
| scaled -= 10;
|
| // ... towards the bottom.
|
| - scaled += (height * width * 4) -
|
| - ((local_renderer->height() / 2) *
|
| - (local_renderer->width() / 2) * 4);
|
| + scaled += (height_ * width_ * 4) - ((local_renderer->height() / 2) *
|
| + (local_renderer->width() / 2) * 4);
|
| // bottom margin...
|
| - scaled -= (width * 2) * 5;
|
| + scaled -= (width_ * 2) * 5;
|
| for (int r = 0; r < local_renderer->height(); r += 2) {
|
| for (int c = 0; c < local_renderer->width(); c += 2) {
|
| scaled[c / 2] = image[c + r * local_renderer->width()];
|
| }
|
| - scaled += width * 2;
|
| + scaled += width_ * 2;
|
| }
|
| }
|
|
|
| +#if GTK_MAJOR_VERSION == 2
|
| gdk_draw_rgb_32_image(draw_area_->window,
|
| - draw_area_->style->fg_gc[GTK_STATE_NORMAL],
|
| - 0,
|
| - 0,
|
| - width * 2,
|
| - height * 2,
|
| - GDK_RGB_DITHER_MAX,
|
| - draw_buffer_.get(),
|
| - (width * 2) * 4);
|
| + draw_area_->style->fg_gc[GTK_STATE_NORMAL], 0, 0,
|
| + width_ * 2, height_ * 2, GDK_RGB_DITHER_MAX,
|
| + draw_buffer_.get(), (width_ * 2) * 4);
|
| +#else
|
| + gtk_widget_queue_draw(draw_area_);
|
| +#endif
|
| }
|
|
|
| gdk_threads_leave();
|
| }
|
|
|
| +void GtkMainWnd::Draw(GtkWidget* widget, cairo_t* cr) {
|
| +#if GTK_MAJOR_VERSION != 2
|
| + cairo_format_t format = CAIRO_FORMAT_RGB24;
|
| + cairo_surface_t* surface = cairo_image_surface_create_for_data(
|
| + draw_buffer_.get(), format, width_ * 2, height_ * 2,
|
| + cairo_format_stride_for_width(format, width_ * 2));
|
| + cairo_set_source_surface(cr, surface, 0, 0);
|
| + cairo_rectangle(cr, 0, 0, width_ * 2, height_ * 2);
|
| + cairo_fill(cr);
|
| + cairo_surface_destroy(surface);
|
| +#else
|
| + RTC_NOTREACHED();
|
| +#endif
|
| +}
|
| +
|
| GtkMainWnd::VideoRenderer::VideoRenderer(
|
| GtkMainWnd* main_wnd,
|
| webrtc::VideoTrackInterface* track_to_render)
|
|
|