From 05d929cd8a3af8d17a3896062323a610b770be21 Mon Sep 17 00:00:00 2001
From: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
Date: Wed, 2 Feb 2022 16:39:57 -0500
Subject: [PATCH] call: add window share button

This adds a windows sharing button in addition to the sharing options.
This button is only available for linux systems and must be enabled
for others (MacOS, Windows) once their windows sharing are functional.

Change-Id: If378a23bc504fd3813382e84a41d914448707616
GitLab: #668
---
 resources/icons/window_black_24dp.svg         |  8 +++++
 src/constant/JamiStrings.qml                  |  1 +
 src/mainview/components/CallActionBar.qml     | 16 +++++++---
 src/mainview/components/CallOverlay.qml       | 32 ++++++++++++-------
 .../components/CallViewContextMenu.qml        | 31 ++++++++++++++----
 src/mainview/components/SelectScreen.qml      | 12 ++++---
 src/mainview/js/selectscreenwindowcreation.js |  3 +-
 7 files changed, 76 insertions(+), 27 deletions(-)
 create mode 100644 resources/icons/window_black_24dp.svg

diff --git a/resources/icons/window_black_24dp.svg b/resources/icons/window_black_24dp.svg
new file mode 100644
index 000000000..37db909fc
--- /dev/null
+++ b/resources/icons/window_black_24dp.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<path d="M20.5,0.8h-17C2,0.8,0.8,2,0.8,3.5v17c0,1.5,1.2,2.7,2.7,2.7h17c1.5,0,2.7-1.2,2.7-2.7v-17C23.2,2,22,0.8,20.5,0.8z
+	 M3.5,2.2h17c0.7,0,1.3,0.6,1.3,1.3v0.1H2.2V3.5C2.2,2.8,2.8,2.2,3.5,2.2z M7.7,21.8H3.5c-0.7,0-1.3-0.6-1.3-1.3V5h5.5h1.4h12.7
+	v15.5c0,0.7-0.6,1.3-1.3,1.3H9.1H7.7z"/>
+</svg>
diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml
index 8080aca88..4c5d17df6 100644
--- a/src/constant/JamiStrings.qml
+++ b/src/constant/JamiStrings.qml
@@ -256,6 +256,7 @@ Item {
     property string exitFullScreen: qsTr("Exit full screen")
     property string fullScreen: qsTr("View full screen")
     property string shareScreen: qsTr("Share screen")
+    property string shareWindow: qsTr("Share window")
     property string stopSharing: qsTr("Stop sharing screen or file")
     property string shareScreenArea: qsTr("Share screen area")
     property string shareFile: qsTr("Share file")
diff --git a/src/mainview/components/CallActionBar.qml b/src/mainview/components/CallActionBar.qml
index e6a08e16b..4ef3937e6 100644
--- a/src/mainview/components/CallActionBar.qml
+++ b/src/mainview/components/CallActionBar.qml
@@ -45,6 +45,7 @@ Control {
     signal resumePauseCallClicked
     signal showInputPanelClicked
     signal shareScreenClicked
+    signal shareWindowClicked
     signal stopSharingClicked
     signal shareScreenAreaClicked
     signal shareFileClicked
@@ -118,6 +119,10 @@ Control {
                 Component.onCompleted: {
                     shareModel.append({"Name": JamiStrings.shareScreen,
                                        "IconSource": JamiResources.laptop_black_24dp_svg})
+                    if (Qt.platform.os == "linux") {
+                        shareModel.append({"Name": JamiStrings.shareWindow,
+                                           "IconSource" : JamiResources.window_black_24dp_svg})
+                    }
                     shareModel.append({"Name": JamiStrings.shareScreenArea,
                                        "IconSource" : JamiResources.share_area_black_24dp_svg})
                     shareModel.append({"Name": JamiStrings.shareFile,
@@ -129,6 +134,9 @@ Control {
                   case JamiStrings.shareScreen:
                       shareScreenClicked()
                       break
+                  case JamiStrings.shareWindow:
+                      shareWindowClicked()
+                      break
                   case JamiStrings.shareScreenArea:
                       shareScreenAreaClicked()
                       break
@@ -258,17 +266,17 @@ Control {
         Action {
             id: shareAction
             onTriggered: {
-                if (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE)
+                if (sharingActive)
                     root.stopSharingClicked()
                 else
                     root.shareScreenClicked()
             }
-            icon.source: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ?
+            icon.source: sharingActive ?
                              JamiResources.share_stop_black_24dp_svg :
                              JamiResources.share_screen_black_24dp_svg
-            icon.color: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ?
+            icon.color: sharingActive ?
                             "red" : "white"
-            text: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE ?
+            text: sharingActive ?
                       JamiStrings.stopSharing :
                       JamiStrings.shareScreen
             property real size: 34
diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml
index 46a4abd63..d24ddddb0 100644
--- a/src/mainview/components/CallOverlay.qml
+++ b/src/mainview/components/CallOverlay.qml
@@ -47,6 +47,7 @@ Item {
     property bool isConferenceCall
     property bool isGrid
     property bool localHandRaised
+    property bool sharingActive: AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE
 
     signal chatButtonClicked
     signal fullScreenClicked
@@ -130,9 +131,7 @@ Item {
         mode: JamiFileDialog.Mode.OpenFile
 
         onAccepted: {
-            if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
-                AvAdapter.muteCamera = root.isVideoMuted
-            }
+            AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
             AvAdapter.shareFile(jamiFileDialog.file)
         }
     }
@@ -157,22 +156,26 @@ Item {
     }
 
     function openShareScreen() {
-        if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
-            AvAdapter.muteCamera = root.isVideoMuted
-        }
-        AvAdapter.getListWindows()
-        if (Qt.application.screens.length + AvAdapter.windowsNames.length === 1) {
+        AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
+        if (Qt.application.screens.length === 1) {
             AvAdapter.shareEntireScreen(0)
         } else {
             SelectScreenWindowCreation.createSelectScreenWindowObject()
-            SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId)
+            SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, false)
         }
     }
 
-    function openShareScreenArea() {
-        if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
-            AvAdapter.muteCamera = root.isVideoMuted
+    function openShareWindow() {
+        AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
+        AvAdapter.getListWindows()
+        if (AvAdapter.windowsNames.length >= 1) {
+            SelectScreenWindowCreation.createSelectScreenWindowObject()
+            SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, true)
         }
+    }
+
+    function openShareScreenArea() {
+        AvAdapter.muteCamera = !sharingActive && root.isVideoMuted
         if (Qt.platform.os !== "windows") {
             AvAdapter.shareScreenArea(0, 0, 0, 0)
         } else {
@@ -206,6 +209,7 @@ Item {
             function onResumePauseCallClicked() { CallAdapter.holdThisCallToggle() }
             function onShowInputPanelClicked() { sipInputPanel.open() }
             function onShareScreenClicked() { openShareScreen() }
+            function onShareWindowClicked() { openShareWindow() }
             function onStopSharingClicked() { AvAdapter.stopSharing() }
             function onShareScreenAreaClicked() { openShareScreenArea() }
             function onRecordCallClicked() { recordClicked() }
@@ -225,5 +229,9 @@ Item {
         onTransferCallButtonClicked: openContactPicker(ContactList.TRANSFER)
         onPluginItemClicked: openPluginsMenu()
         onRecordCallClicked: root.recordClicked()
+        onOpenSelectionWindow: {
+            SelectScreenWindowCreation.createSelectScreenWindowObject()
+            SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId, windowSelection)
+        }
     }
 }
diff --git a/src/mainview/components/CallViewContextMenu.qml b/src/mainview/components/CallViewContextMenu.qml
index baf4565c2..355fe9b8a 100644
--- a/src/mainview/components/CallViewContextMenu.qml
+++ b/src/mainview/components/CallViewContextMenu.qml
@@ -26,7 +26,6 @@ import net.jami.Constants 1.1
 
 import "../../commoncomponents"
 import "../../commoncomponents/contextmenu"
-import "../js/selectscreenwindowcreation.js" as SelectScreenWindowCreation
 import "../js/screenrubberbandcreation.js" as ScreenRubberBandCreation
 
 ContextMenuAutoLoader {
@@ -37,9 +36,12 @@ ContextMenuAutoLoader {
     property bool isVideoMuted: false
     property bool isRecording: false
 
+    property bool windowSelection: false
+
     signal pluginItemClicked
     signal transferCallButtonClicked
     signal recordCallClicked
+    signal openSelectionWindow
 
     property list<GeneralMenuItem> menuItems: [
         GeneralMenuItem {
@@ -101,7 +103,7 @@ ContextMenuAutoLoader {
         GeneralMenuItem {
             id: stopSharing
 
-            canTrigger: (AvAdapter.currentRenderingDeviceType === Video.DeviceType.DISPLAY || AvAdapter.currentRenderingDeviceType === Video.DeviceType.FILE)
+            canTrigger: sharingActive
                         && !isSIP && !isVideoMuted
             itemName: JamiStrings.stopSharing
             iconSource: JamiResources.share_stop_black_24dp_svg
@@ -119,12 +121,29 @@ ContextMenuAutoLoader {
                 if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
                     AvAdapter.muteCamera = root.isVideoMuted
                 }
-                AvAdapter.getListWindows()
-                if (Qt.application.screens.length + AvAdapter.windowsNames().length === 1) {
+                if (Qt.application.screens.length === 1) {
                     AvAdapter.shareEntireScreen(0)
                 } else {
-                    SelectScreenWindowCreation.createSelectScreenWindowObject()
-                    SelectScreenWindowCreation.showSelectScreenWindow(callPreviewId)
+                    windowSelection = false
+                    openSelectionWindow()
+                }
+            }
+        },
+        GeneralMenuItem {
+            id: shareWindow
+
+            canTrigger: Qt.platform.os === "linux" && CurrentAccount.videoEnabled_Video && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY
+                        && !isSIP
+            itemName: JamiStrings.shareWindow
+            iconSource: JamiResources.window_black_24dp_svg
+            onClicked: {
+                if (AvAdapter.currentRenderingDeviceType !== Video.DeviceType.DISPLAY && AvAdapter.currentRenderingDeviceType !== Video.DeviceType.FILE) {
+                    AvAdapter.muteCamera = root.isVideoMuted
+                }
+                AvAdapter.getListWindows()
+                if (AvAdapter.windowsNames.length >= 1) {
+                    windowSelection = true
+                    openSelectionWindow()
                 }
             }
         },
diff --git a/src/mainview/components/SelectScreen.qml b/src/mainview/components/SelectScreen.qml
index 332c3c174..377cb0350 100644
--- a/src/mainview/components/SelectScreen.qml
+++ b/src/mainview/components/SelectScreen.qml
@@ -37,6 +37,8 @@ Window {
     property int minWidth: 650
     property int minHeight: 500
 
+    property bool window: false
+
     property int selectedScreenNumber: -1
     property bool selectAllScreens: false
     property string currentPreview: ""
@@ -68,7 +70,7 @@ Window {
         calculateRepeaterModel()
         screenInfo.model = screens.length
         screenInfo2.model = screens.length
-        windowsText.visible = screens.length > Qt.application.screens.length
+        windowsText.visible = root.window
     }
     minimumWidth: minWidth
     minimumHeight: minHeight
@@ -118,6 +120,7 @@ Window {
                     text: JamiStrings.screens
                     verticalAlignment: Text.AlignBottom
                     color: JamiTheme.textColor
+                    visible: !root.window
                 }
 
                 Repeater {
@@ -135,7 +138,7 @@ Window {
                         height: 3 * width / 4
 
                         border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
-                        visible: JamiStrings.selectScreen !== screens[index] && index < Qt.application.screens.length
+                        visible: !root.window && JamiStrings.selectScreen !== screens[index] && index < Qt.application.screens.length
 
                         Text {
                             id: screenName
@@ -210,7 +213,7 @@ Window {
 
                     border.color: selectAllScreens ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
 
-                    visible: Qt.application.screens.length > 1
+                    visible: !root.window && Qt.application.screens.length > 1
 
                     Text {
                         id: screenNameAll
@@ -269,6 +272,7 @@ Window {
                     text: JamiStrings.windows
                     verticalAlignment: Text.AlignBottom
                     color: JamiTheme.textColor
+                    visible: root.window
                 }
 
                 Repeater {
@@ -286,7 +290,7 @@ Window {
                         height: 3 * width / 4
 
                         border.color: selectedScreenNumber === index ? JamiTheme.screenSelectionBorderColor : JamiTheme.tabbarBorderColor
-                        visible: JamiStrings.selectScreen !== screens[index] && index >= Qt.application.screens.length
+                        visible: root.window && JamiStrings.selectScreen !== screens[index] && index >= Qt.application.screens.length
 
                         Text {
                             id: screenName2
diff --git a/src/mainview/js/selectscreenwindowcreation.js b/src/mainview/js/selectscreenwindowcreation.js
index 6be4c2b3d..1ae7394d4 100644
--- a/src/mainview/js/selectscreenwindowcreation.js
+++ b/src/mainview/js/selectscreenwindowcreation.js
@@ -43,9 +43,10 @@ function finishCreation() {
     selectScreenWindowObject.onClosing.connect(destroySelectScreenWindow)
 }
 
-function showSelectScreenWindow(previewId) {
+function showSelectScreenWindow(previewId, window) {
     console.log("previewId", previewId)
     selectScreenWindowObject.currentPreview = previewId
+    selectScreenWindowObject.window = window
     selectScreenWindowObject.show()
 
     var screen = selectScreenWindowObject.screen
-- 
GitLab