gnome: video fullscreen

Refs #66538

Change-Id: I554db5a884cda78d89bbe69905089311c762b132
diff --git a/src/currentcallview.cpp b/src/currentcallview.cpp
index b9a8139..b019f64 100644
--- a/src/currentcallview.cpp
+++ b/src/currentcallview.cpp
@@ -199,6 +199,75 @@
     return FALSE; /* do not call again */
 }
 
+static void
+fullscreen_destroy(CurrentCallView *view)
+{
+    g_return_if_fail(IS_CURRENT_CALL_VIEW(view));
+    CurrentCallViewPrivate *priv = CURRENT_CALL_VIEW_GET_PRIVATE(view);
+
+    /* check if the video widgets parent is the the fullscreen window */
+    GtkWidget *parent = gtk_widget_get_parent(priv->video_widget);
+    if (parent != NULL && parent != priv->frame_video) {
+        /* put the videw widget back in the call view */
+        g_object_ref(priv->video_widget);
+        gtk_container_remove(GTK_CONTAINER(parent), priv->video_widget);
+        gtk_container_add(GTK_CONTAINER(priv->frame_video), priv->video_widget);
+        g_object_unref(priv->video_widget);
+        /* destroy the fullscreen window */
+        gtk_widget_destroy(parent);
+    }
+}
+
+static gboolean
+fullscreen_handle_keys(GtkWidget *self, GdkEventKey *event, G_GNUC_UNUSED gpointer user_data)
+{
+    if (event->keyval == GDK_KEY_Escape)
+        gtk_widget_destroy(self);
+
+    /* the event has been fully handled */
+    return TRUE;
+}
+
+static gboolean
+on_button_press_in_video_event(GtkWidget *self, GdkEventButton *event, CurrentCallView *view)
+{
+    g_return_val_if_fail(IS_VIDEO_WIDGET(self), FALSE);
+    g_return_val_if_fail(IS_CURRENT_CALL_VIEW(view), FALSE);
+    CurrentCallViewPrivate *priv = CURRENT_CALL_VIEW_GET_PRIVATE(view);
+
+    /* on double click */
+    if (event->type == GDK_2BUTTON_PRESS) {
+
+        /* get the parent to check if its in fullscreen window or not */
+        GtkWidget *parent = gtk_widget_get_parent(GTK_WIDGET(self));
+        if (parent == priv->frame_video){
+            /* not fullscreen, so put it in a separate widget and make it so */
+            GtkWidget *fullscreen_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+            gtk_window_set_decorated(GTK_WINDOW(fullscreen_window), FALSE);
+            gtk_window_set_transient_for(GTK_WINDOW(fullscreen_window),
+                                         GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view))));
+            g_object_ref(self);
+            gtk_container_remove(GTK_CONTAINER(priv->frame_video), self);
+            gtk_container_add(GTK_CONTAINER(fullscreen_window), self);
+            g_object_unref(self);
+            /* connect signals to make sure we can un-fullscreen */
+            g_signal_connect_swapped(fullscreen_window, "destroy", G_CALLBACK(fullscreen_destroy), view);
+            g_signal_connect(view, "destroy", G_CALLBACK(fullscreen_destroy), NULL);
+            g_signal_connect(fullscreen_window, "key_press_event", G_CALLBACK(fullscreen_handle_keys), NULL);
+            /* present the fullscreen widnow */
+            gtk_window_present(GTK_WINDOW(fullscreen_window));
+            gtk_window_fullscreen(GTK_WINDOW(fullscreen_window));
+        } else {
+            /* put it back in the call view */
+            fullscreen_destroy(view);
+        }
+    }
+
+    /* the event has been fully handled */
+    return TRUE;
+}
+
+
 void
 current_call_view_set_call_info(CurrentCallView *view, const QModelIndex& idx) {
     CurrentCallViewPrivate *priv = CURRENT_CALL_VIEW_GET_PRIVATE(view);
@@ -259,4 +328,9 @@
     /* preview renderer */
     video_widget_set_local_renderer(VIDEO_WIDGET(priv->video_widget),
                                     Video::PreviewManager::instance()->previewRenderer());
+
+    /* catch double click to make full screen */
+    g_signal_connect(priv->video_widget, "button-press-event",
+                     G_CALLBACK(on_button_press_in_video_event),
+                     view);
 }
diff --git a/src/video/video_widget.cpp b/src/video/video_widget.cpp
index 411c912..1d3d544 100644
--- a/src/video/video_widget.cpp
+++ b/src/video/video_widget.cpp
@@ -63,7 +63,6 @@
 };
 
 struct _VideoWidgetRenderer {
-    gboolean                 show;
     ClutterActor            *actor;
     Video::Renderer         *renderer;
     QMetaObject::Connection  frame_update;
@@ -272,15 +271,14 @@
 static void
 renderer_stop(VideoWidgetRenderer *renderer)
 {
+    g_return_if_fail(CLUTTER_IS_ACTOR(renderer->actor));
     QObject::disconnect(renderer->frame_update);
-    renderer->show = FALSE;
 }
 
 static void
 renderer_start(VideoWidgetRenderer *renderer)
 {
-    renderer->show = TRUE;
-
+    g_return_if_fail(CLUTTER_IS_ACTOR(renderer->actor));
     renderer->frame_update = QObject::connect(
         renderer->renderer,
         &Video::Renderer::frameUpdated,
diff --git a/ui/currentcallview.ui b/ui/currentcallview.ui
index 526ae11..ede82e2 100644
--- a/ui/currentcallview.ui
+++ b/ui/currentcallview.ui
@@ -57,6 +57,7 @@
         <child>
           <object class="GtkFrame" id="frame_video">
             <property name="visible">False</property>
+            <property name="shadow-type">GTK_SHADOW_NONE</property>
           </object>
         </child>
         <!-- end of video widget -->