gtkglwidget: Calculate the viewport size ourselves
authorSebastian Dröge <sebastian@centricular.com>
Mon, 15 Jun 2015 19:29:46 +0000 (21:29 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 15 Jun 2015 19:29:46 +0000 (21:29 +0200)
Getting the current viewport and modifying it relatively will produce an
interesting feedback loop during widget resizing. Over a few frames we
will gradually move the viewport a bit until it converged again, adding
unnecessary additional borders at the top and left.

ext/gtk/gtkgstglwidget.c

index d9b65e3..96ac861 100644 (file)
@@ -210,22 +210,24 @@ _redraw_texture (GtkGstGLWidget * gst_widget, guint tex)
 
   if (gst_widget->priv->force_aspect_ratio) {
     GstVideoRectangle src, dst, result;
-    gint gtk_viewport[4];
+    gint widget_width, widget_height, widget_scale;
 
     gl->ClearColor (0.0, 0.0, 0.0, 0.0);
     gl->Clear (GL_COLOR_BUFFER_BIT);
 
-    gl->GetIntegerv (GL_VIEWPORT, gtk_viewport);
+    widget_scale = gtk_widget_get_scale_factor ((GtkWidget *) gst_widget);
+    widget_width = gtk_widget_get_allocated_width ((GtkWidget *) gst_widget);
+    widget_height = gtk_widget_get_allocated_height ((GtkWidget *) gst_widget);
 
     src.x = 0;
     src.y = 0;
     src.w = gst_widget->priv->display_width;
     src.h = gst_widget->priv->display_height;
 
-    dst.x = gtk_viewport[0];
-    dst.y = gtk_viewport[1];
-    dst.w = gtk_viewport[2];
-    dst.h = gtk_viewport[3];
+    dst.x = 0;
+    dst.y = 0;
+    dst.w = widget_width * widget_scale;
+    dst.h = widget_height * widget_scale;
 
     gst_video_sink_center_rect (src, dst, &result, TRUE);